代码之家  ›  专栏  ›  技术社区  ›  watery

从没有用户定义变量的有序值中查找值范围?

  •  0
  • watery  · 技术社区  · 5 年前

    报告日期 价值 有效性
    34725 1.
    2021-02-26 1.
    2021-02-27
    2021-02-28
    2021-03-01 34818 0
    34818 0
    34928 0
    2021-03-08 34952 0
    2021-03-09 34976 1.
    1.

    我需要找到 有效性

    开始日期
    2021-02-25 2021-02-26
    2021-03-09 2021-03-10

    SELECT
        MIN(reported_date) AS begin_date,
        MAX(reported_date) AS end_date
    FROM
        (
        SELECT
            reported_date,
            validity,
            @valgrp := (
            CASE
                WHEN MOD(@valgrp, 100) != validity THEN @valgrp + 100 - MOD(@valgrp, 100) + validity
                WHEN @valgrp IS NULL THEN 100 + validity
                ELSE @valgrp
            END ) AS validity_group
        FROM
            ...
        WHERE
            ... ) v
    GROUP BY
        validity_group
    

    但这依赖于一个用户定义的变量 according to the docs 可能是未来的证明:

    语句中的用户变量,而不是SET。此功能是 MySQL 8.0支持向后兼容,但受 在MySQL的未来版本中删除。

    我有什么选择?

    0 回复  |  直到 5 年前
        1
  •  0
  •   forpas    5 年前

    您可以使用窗口函数 LAG() SUM() 创建具有相同连续行的行组的步骤 validity 然后获取每个组的最小和最大日期:

    SELECT MIN(reported_date) begin_date,   
           MAX(reported_date) end_date
    FROM (       
      SELECT *, SUM(flag) OVER (ORDER BY reported_date) grp
      FROM (
        SELECT *, COALESCE(validity <> LAG(validity) OVER (ORDER BY reported_date), 1) flag
        FROM tablename
      ) t 
    ) t  
    GROUP BY grp
    

    demo .