将 CASE 函数添加到此现有查询?
Adding CASE function to this existing query?
我一直在尝试添加 CASE 函数,但没有成功。 [MySQL8.0]
SELECT *
, LEAD(total_weight, 1) OVER(
ORDER BY weight_date DESC
) AS prev_total_weight
, MIN(total_weight) OVER() AS lowest_weight
, MAX(total_weight) OVER() AS highest_weight
, FROM_UNIXTIME(weight_date, '%u') AS weight_week
,CASE
WHEN total_weight > prev_total_weight THEN 'greater'
WHEN total_weight = prev_total_weight THEN 'equal'
ELSE 'less'
END AS comparison
, ROW_NUMBER() OVER(
ORDER BY weight_date DESC
) AS RowNum
FROM (
SELECT *, weight_start_week + weight_end_week AS total_weight
FROM YourTable
) t
ORDER BY RowNum
我收到响应“'field list' 中的未知列 'prev_total_weight'”
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=7683dd91c0603aa841ceea82e4e848fc
希望得到一些帮助。谢谢
window 函数值,在处理过程中不能访问,值总是0,烦死了。
您必须先处理所有数据。就像我在 CTE 中的新查询
然后制作你的 CASE WHEN
CREATE TABLE YourTable
(`_ID` int, `weight_date` bigint, `weight_start_week` decimal(10,2), `weight_end_week` decimal(10,2))
;
INSERT INTO YourTable
(`_ID`, `weight_date`, `weight_start_week`, `weight_end_week`)
VALUES
(52, 1636675200, 4.30, 4.30),
(53, 1637280000, 4.60, 7.10),
(54, 1637884800, 4.55, 4.05),
(55, 1638489600, 4.90, 4.60),
(56, 1639094400, 3.20, 8.25),
(57, 1639699200, 4.75, 7.80),
(58, 1640131200, 4.50, 4.70),
(59, 1640908800, 6.05, 5.75),
(60, 1641513600, 6.30, 6.60),
(61, 1642118400, 8.70, 7.00),
(62, 1642723200, 3.50, 3.60),
(63, 1643328000, 8.20, 3.85)
;
SELECT FROM_UNIXTIME(weight_date)
, t.*
, t.weight_start_week + t.weight_end_week AS Total
FROM YourTable t
ORDER BY weight_date DESC
FROM_UNIXTIME(weight_date) | _ID | weight_date | weight_start_week | weight_end_week | Total
:------------------------- | --: | ----------: | ----------------: | --------------: | ----:
2022-01-28 00:00:00 | 63 | 1643328000 | 8.20 | 3.85 | 12.05
2022-01-21 00:00:00 | 62 | 1642723200 | 3.50 | 3.60 | 7.10
2022-01-14 00:00:00 | 61 | 1642118400 | 8.70 | 7.00 | 15.70
2022-01-07 00:00:00 | 60 | 1641513600 | 6.30 | 6.60 | 12.90
2021-12-31 00:00:00 | 59 | 1640908800 | 6.05 | 5.75 | 11.80
2021-12-22 00:00:00 | 58 | 1640131200 | 4.50 | 4.70 | 9.20
2021-12-17 00:00:00 | 57 | 1639699200 | 4.75 | 7.80 | 12.55
2021-12-10 00:00:00 | 56 | 1639094400 | 3.20 | 8.25 | 11.45
2021-12-03 00:00:00 | 55 | 1638489600 | 4.90 | 4.60 | 9.50
2021-11-26 00:00:00 | 54 | 1637884800 | 4.55 | 4.05 | 8.60
2021-11-19 00:00:00 | 53 | 1637280000 | 4.60 | 7.10 | 11.70
2021-11-12 00:00:00 | 52 | 1636675200 | 4.30 | 4.30 | 8.60
WITH CTE as ( SELECT
*
,
LEAD(total_weight, 1) OVER(
ORDER BY weight_date DESC
) AS prev_total_weight
, MIN(total_weight) OVER() AS lowest_weight
, MAX(total_weight) OVER() AS highest_weight
, FROM_UNIXTIME(weight_date, '%u') AS weight_week
, ROW_NUMBER() OVER(
ORDER BY weight_date DESC
) AS RowNum
FROM (
SELECT *, weight_start_week + weight_end_week AS total_weight
FROM YourTable
) t
)
SELECT
`_ID`, `weight_date`, `weight_start_week`, `weight_end_week`
prev_total_weight
,lowest_weight
,highest_weight
,weight_week
,CASE
WHEN total_weight > prev_total_weight THEN 'greater'
WHEN total_weight = prev_total_weight THEN 'equal'
ELSE 'less'
END AS comparison
,RowNum
FROM CTE
_ID | weight_date | weight_start_week | prev_total_weight | lowest_weight | highest_weight | weight_week | comparison | RowNum
--: | ----------: | ----------------: | ----------------: | ------------: | -------------: | :---------- | :--------- | -----:
63 | 1643328000 | 8.20 | 3.85 | 7.10 | 15.70 | 04 | greater | 1
62 | 1642723200 | 3.50 | 3.60 | 7.10 | 15.70 | 03 | less | 2
61 | 1642118400 | 8.70 | 7.00 | 7.10 | 15.70 | 02 | greater | 3
60 | 1641513600 | 6.30 | 6.60 | 7.10 | 15.70 | 01 | greater | 4
59 | 1640908800 | 6.05 | 5.75 | 7.10 | 15.70 | 52 | greater | 5
58 | 1640131200 | 4.50 | 4.70 | 7.10 | 15.70 | 51 | less | 6
57 | 1639699200 | 4.75 | 7.80 | 7.10 | 15.70 | 50 | greater | 7
56 | 1639094400 | 3.20 | 8.25 | 7.10 | 15.70 | 49 | greater | 8
55 | 1638489600 | 4.90 | 4.60 | 7.10 | 15.70 | 48 | greater | 9
54 | 1637884800 | 4.55 | 4.05 | 7.10 | 15.70 | 47 | less | 10
53 | 1637280000 | 4.60 | 7.10 | 7.10 | 15.70 | 46 | greater | 11
52 | 1636675200 | 4.30 | 4.30 | 7.10 | 15.70 | 45 | less | 12
db<>fiddle here
我一直在尝试添加 CASE 函数,但没有成功。 [MySQL8.0]
SELECT *
, LEAD(total_weight, 1) OVER(
ORDER BY weight_date DESC
) AS prev_total_weight
, MIN(total_weight) OVER() AS lowest_weight
, MAX(total_weight) OVER() AS highest_weight
, FROM_UNIXTIME(weight_date, '%u') AS weight_week
,CASE
WHEN total_weight > prev_total_weight THEN 'greater'
WHEN total_weight = prev_total_weight THEN 'equal'
ELSE 'less'
END AS comparison
, ROW_NUMBER() OVER(
ORDER BY weight_date DESC
) AS RowNum
FROM (
SELECT *, weight_start_week + weight_end_week AS total_weight
FROM YourTable
) t
ORDER BY RowNum
我收到响应“'field list' 中的未知列 'prev_total_weight'” https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=7683dd91c0603aa841ceea82e4e848fc
希望得到一些帮助。谢谢
window 函数值,在处理过程中不能访问,值总是0,烦死了。
您必须先处理所有数据。就像我在 CTE 中的新查询
然后制作你的 CASE WHEN
CREATE TABLE YourTable (`_ID` int, `weight_date` bigint, `weight_start_week` decimal(10,2), `weight_end_week` decimal(10,2)) ; INSERT INTO YourTable (`_ID`, `weight_date`, `weight_start_week`, `weight_end_week`) VALUES (52, 1636675200, 4.30, 4.30), (53, 1637280000, 4.60, 7.10), (54, 1637884800, 4.55, 4.05), (55, 1638489600, 4.90, 4.60), (56, 1639094400, 3.20, 8.25), (57, 1639699200, 4.75, 7.80), (58, 1640131200, 4.50, 4.70), (59, 1640908800, 6.05, 5.75), (60, 1641513600, 6.30, 6.60), (61, 1642118400, 8.70, 7.00), (62, 1642723200, 3.50, 3.60), (63, 1643328000, 8.20, 3.85) ;
SELECT FROM_UNIXTIME(weight_date) , t.* , t.weight_start_week + t.weight_end_week AS Total FROM YourTable t ORDER BY weight_date DESC
FROM_UNIXTIME(weight_date) | _ID | weight_date | weight_start_week | weight_end_week | Total :------------------------- | --: | ----------: | ----------------: | --------------: | ----: 2022-01-28 00:00:00 | 63 | 1643328000 | 8.20 | 3.85 | 12.05 2022-01-21 00:00:00 | 62 | 1642723200 | 3.50 | 3.60 | 7.10 2022-01-14 00:00:00 | 61 | 1642118400 | 8.70 | 7.00 | 15.70 2022-01-07 00:00:00 | 60 | 1641513600 | 6.30 | 6.60 | 12.90 2021-12-31 00:00:00 | 59 | 1640908800 | 6.05 | 5.75 | 11.80 2021-12-22 00:00:00 | 58 | 1640131200 | 4.50 | 4.70 | 9.20 2021-12-17 00:00:00 | 57 | 1639699200 | 4.75 | 7.80 | 12.55 2021-12-10 00:00:00 | 56 | 1639094400 | 3.20 | 8.25 | 11.45 2021-12-03 00:00:00 | 55 | 1638489600 | 4.90 | 4.60 | 9.50 2021-11-26 00:00:00 | 54 | 1637884800 | 4.55 | 4.05 | 8.60 2021-11-19 00:00:00 | 53 | 1637280000 | 4.60 | 7.10 | 11.70 2021-11-12 00:00:00 | 52 | 1636675200 | 4.30 | 4.30 | 8.60
WITH CTE as ( SELECT * , LEAD(total_weight, 1) OVER( ORDER BY weight_date DESC ) AS prev_total_weight , MIN(total_weight) OVER() AS lowest_weight , MAX(total_weight) OVER() AS highest_weight , FROM_UNIXTIME(weight_date, '%u') AS weight_week , ROW_NUMBER() OVER( ORDER BY weight_date DESC ) AS RowNum FROM ( SELECT *, weight_start_week + weight_end_week AS total_weight FROM YourTable ) t ) SELECT `_ID`, `weight_date`, `weight_start_week`, `weight_end_week` prev_total_weight ,lowest_weight ,highest_weight ,weight_week ,CASE WHEN total_weight > prev_total_weight THEN 'greater' WHEN total_weight = prev_total_weight THEN 'equal' ELSE 'less' END AS comparison ,RowNum FROM CTE
_ID | weight_date | weight_start_week | prev_total_weight | lowest_weight | highest_weight | weight_week | comparison | RowNum --: | ----------: | ----------------: | ----------------: | ------------: | -------------: | :---------- | :--------- | -----: 63 | 1643328000 | 8.20 | 3.85 | 7.10 | 15.70 | 04 | greater | 1 62 | 1642723200 | 3.50 | 3.60 | 7.10 | 15.70 | 03 | less | 2 61 | 1642118400 | 8.70 | 7.00 | 7.10 | 15.70 | 02 | greater | 3 60 | 1641513600 | 6.30 | 6.60 | 7.10 | 15.70 | 01 | greater | 4 59 | 1640908800 | 6.05 | 5.75 | 7.10 | 15.70 | 52 | greater | 5 58 | 1640131200 | 4.50 | 4.70 | 7.10 | 15.70 | 51 | less | 6 57 | 1639699200 | 4.75 | 7.80 | 7.10 | 15.70 | 50 | greater | 7 56 | 1639094400 | 3.20 | 8.25 | 7.10 | 15.70 | 49 | greater | 8 55 | 1638489600 | 4.90 | 4.60 | 7.10 | 15.70 | 48 | greater | 9 54 | 1637884800 | 4.55 | 4.05 | 7.10 | 15.70 | 47 | less | 10 53 | 1637280000 | 4.60 | 7.10 | 7.10 | 15.70 | 46 | greater | 11 52 | 1636675200 | 4.30 | 4.30 | 7.10 | 15.70 | 45 | less | 12
db<>fiddle here