【问题标题】:set a variable in mysql based on case when-then根据 case when-then 在 mysql 中设置一个变量
【发布时间】:2021-03-12 14:34:54
【问题描述】:

我有一个 Projects 表,其中包含三列:Task_IDStart_DateEnd_Date。 每当上一行的 End_Date 和当前行的 Start_Date 之间的差异不等于零时,我正在尝试两次增加一个名为 count 的变量,但它正在每行递增。那么,如何根据 CASE when-then 语句改变 mysql 中变量的值呢?


SQL 查询 -

SET @count := 0;
SELECT
*,
LAG(end_date) OVER(ORDER BY start_date) as prev,
DATEDIFF(LAG(end_date) OVER(ORDER BY start_date), start_date) as diff,
(CASE
    WHEN DATEDIFF(LAG(end_date) OVER(ORDER BY start_date), start_date) is NULL
    THEN @count
    WHEN DATEDIFF(LAG(end_date) OVER(ORDER BY start_date), start_date) = 0
    THEN @count
    ELSE @count := @count + 1
END) as cnt
FROM projects
;

输出 -

task_id start_date end_date prev         diff cnt
1      2015-10-01 2015-10-02 NULL        NULL 1
24     2015-10-02 2015-10-03 2015-10-02   0   2
2      2015-10-03 2015-10-04 2015-10-03   0   3
23     2015-10-04 2015-10-05 2015-10-04   0   4
3      2015-10-11 2015-10-12 2015-10-05  -6   5
22     2015-10-12 2015-10-13 2015-10-12   0   6
4      2015-10-15 2015-10-16 2015-10-13  -2   7
21     2015-10-17 2015-10-18 2015-10-16  -1   8
5      2015-10-19 2015-10-20 2015-10-18  -1   9

预期输出 -

task_id start_date end_date prev         diff cnt
1      2015-10-01 2015-10-02 NULL        NULL 0
24     2015-10-02 2015-10-03 2015-10-02   0   0
2      2015-10-03 2015-10-04 2015-10-03   0   0
23     2015-10-04 2015-10-05 2015-10-04   0   0
3      2015-10-11 2015-10-12 2015-10-05  -6   1
22     2015-10-12 2015-10-13 2015-10-12   0   1
4      2015-10-15 2015-10-16 2015-10-13  -2   2
21     2015-10-17 2015-10-18 2015-10-16  -1   3
5      2015-10-19 2015-10-20 2015-10-18  -1   4

【问题讨论】:

    标签: mysql sql case case-when


    【解决方案1】:

    你没有。使用使用窗口函数:

    SELECT p.*,
           SUM(diff < 0) OVER (ORDER BY start_date)
    FROM (SELECT p.*,
                 LAG(end_date) OVER(ORDER BY start_date) as prev,
                 DATEDIFF(LAG(end_date) OVER (ORDER BY start_date), start_date) as diff
          FROM projects p
         ) p;
    

    SUM(diff &lt; 0)SUM(CASE WHEN diff &lt; 0 THEN 1 ELSE 0 END) 的简写。 MySQL 在算术上下文中将布尔值视为整数。

    【讨论】:

    • 感谢您的解决方案!它工作正常,但你能解释一下这条线SUM(diff &lt; 0) OVER (ORDER BY start_date)。另外,只想知道用case语句是否可行。
    • @GauravThakur。 . .是的。 SUM(diff &lt; 0) 只是 MySQL 支持的一种方便的简写形式。
    • 那么,同样的事情不能通过 case 语句来实现?
    • @GauravThakur。 . .我在修改后的答案中有一个CASE 表达式。
    • 知道了!谢谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 2020-11-14
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 2012-02-24
    相关资源
    最近更新 更多