2

我有一个看起来像这样的日历表:

    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 BYUNION查询都给了我单独的条目,但我不知道如何创建日期范围。

4

2 回答 2

1

假设表名是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
于 2012-09-23T07:28:22.393 回答
0

在尝试了很多事情之后,解决问题的查询是:

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;

谢谢大家的帮助。

于 2012-09-23T18:32:41.763 回答