簡體   English   中英

MySQL根據另一列創建日期范圍

[英]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 BYUNION查詢都為我提供了單獨的條目,但是我不知道如何創建日期范圍。

假設表名稱為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM