我有一个看起来像这样的日历表:
date | qty
-------------------
1998-11-18 | 2
1998-11-19 | 0
1998-11-20 | 0
1998-11-21 | 0
1998-11-22 | 3
1998-11-23 | 0
1998-11-24 | 0
1998-11-25 | 3
我想生成一个报告,这将使与该项目的范围0
值量( qty
)。 我不能硬编码的日期,他们需要通过第二列的值来确定。 从以上,报告应该是这样的:
1998-11-19 - 1998-11-21
1998-11-23 - 1998-11-24
所有GROUP BY
和UNION
查询给我的每个条目,但我无法弄清楚如何创建日期范围。
假设表名是calendar
,下面的查询做工作:
SELECT
MIN(t.date),
MAX(t.date)
from
(SELECT
c.date,
MAX(prev.date) mindat,
MIN(next.date) maxdat
FROM
calendar c,
calendar prev,
calendar next
WHERE
c.qty = 0 AND
c.date > prev.date AND prev.qty != 0 AND
c.date < next.date AND next.qty != 0
GROUP BY
c.date) t
GROUP BY
mindat, maxdat
在内部查询,我们基本上加入calendar
表本身两次:第一次加入( c
表prev
表)选择其在每个比日期更小的最大日期c
表行。 这给了我们时间间隔的起点行所属。 第二个连接结束以同样的方式选择时间间隔。
外部查询提取从间隔最小和最大的日期。
我测试的查询与您的数据,这里是输出:
min(t.date) max(t.date)
1998-11-19 1998-11-21
1998-11-23 1998-11-24
尝试了一些事情之后,解决该问题的查询是:
SELECT start_date, MAX(dates) AS End
FROM (
SELECT calendar.*,
@f:=CONVERT(
IF(@r<=>gty AND DATEDIFF(dates, @d)=1, @f, dates), DATE
) AS start_date,
@d:=dates, @r:=gty
FROM calendar JOIN (SELECT @d:=NULL) AS init
where gty="0"
ORDER BY gty, dates
) AS t
GROUP BY start_date, gty;
谢谢大家的帮助。