我正在尝试生成一个日期范围序列,并将日期放在第二行,如果排序在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
发布于 2016-01-11 13:16:28
您希望使用相同的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;对于较大数量的数据,您可以使用变量而不是相关的子查询。
发布于 2016-01-11 13:16:40
像这样的事情应该有效:
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将增加一个以表示下一个序列。
https://stackoverflow.com/questions/34722366
复制相似问题