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。日付をハードコーディングすることはできません。2番目の列の値によって決定する必要があります。上記から、レポートは次のようになります。

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テーブルをそれ自体に2回結合します。最初の結合(cテーブルからテーブルへ)は、各テーブル行prevの日付よりも小さい最大日付を選択します。cこれにより、行が属する間隔の開始が得られます。2 番目の結合は、同じ方法で終了する間隔を選択します。

外部クエリは、間隔から最小および最大の日付を抽出します。

あなたのデータでクエリをテストしましたが、出力は次のとおりです。

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 に答える