仅按排序的日期范围分组 MYSQL
Group By Date Range of Sequenced Only MYSQL
我正在尝试生成一个日期范围序列,如果排序在 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 中翻译这个问题时遇到了困难:
您想要识别具有相同 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;
对于大量数据,您可以使用变量而不是相关子查询。
像这样的东西应该可以工作:
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
递增 1 以表示下一个序列。
我正在尝试生成一个日期范围序列,如果排序在 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 中翻译这个问题时遇到了困难:
您想要识别具有相同 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;
对于大量数据,您可以使用变量而不是相关子查询。
像这样的东西应该可以工作:
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
递增 1 以表示下一个序列。