将 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