【问题标题】:Group By Date Range of Sequenced Only MYSQL仅排序MYSQL的按日期范围分组
【发布时间】:2016-04-15 19:27:54
【问题描述】:

如果排序在 MYSQL 中按值中断,我正在尝试生成日期范围序列并将日期放在第二行

    fldDate        TotalNo
    2015-04-01       10
    2015-04-02       10
    2015-04-03       5
    2015-04-04       10
    2015-04-05       10

我正在寻找mysql查询得到它如下:

    start_dt         end_dt        TotalNo 
    2015-04-01       2015-04-02      10
    2015-04-03       2015-04-03       5
    2015-04-04       2015-04-05      10

我发现了一个类似的问题,但在 mysql 中翻译时遇到了困难: link to post

【问题讨论】:

  • MySQL 还是 MS SQL Server? (不要标记未涉及的产品...)

标签: mysql date date-range


【解决方案1】:

您想识别具有相同TotalNo 的相邻行组。关键是要识别出能够识别这些群体的东西。一种度量是TotalNo 的值与一行中的值不同的数量。如果您的数据不是很大,您可以为此使用相关子查询。

一旦你确定了组,最终的结果就是简单的聚合:

select min(fldDate) as start_dt, max(fldDate) as end_dt, TotalNo
from (select t.*,
             (select count(*)
              from t t2
              where t2.fldDate < t.fldDate and t2.TotalNo <> t.TotalNo
             ) as grp
      from t
     ) t
group by grp, TotalNo;

对于大量数据,您应该使用变量而不是相关子查询。

【讨论】:

    【解决方案2】:

    这样的事情应该可以工作:

    SELECT MIN(fldDate) AS start_dt, MAX(fldDate) AS end_dt, TotalNo
    FROM (
      SELECT fldDate, TotalNo,      
             @grp := IF(@t = TotalNo, @grp, 
                        IF(@t := TotalNo, @grp + 1, @grp + 1)) AS grp
      FROM mytable
      CROSS JOIN (SELECT @grp := 0, @t := 0)
      ORDER BY fldDate ) AS t
    GROUP By TotalNo, grp
    

    @grp 变量标识具有相同 TotalNo 值的连续 记录行。当TotalNo序列出现中断时,@grp加一,表示下一个序列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-31
      • 2019-02-14
      • 2013-08-14
      • 1970-01-01
      • 1970-01-01
      • 2013-11-04
      • 2021-11-16
      相关资源
      最近更新 更多