[英]MySQL creating date ranges based on another column
我有一個日歷表,如下所示:
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
我正在嘗試生成一個報告,該報告將為數量( qty
)提供0
值的條目范圍。 我無法對日期進行硬編碼,它們需要由第二列的值確定。 從上面看,報告應如下所示:
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;
謝謝大家的幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.