0

かなり複雑なクエリがあり、助けが必要です。

基本的に、私のテーブルには 4 つのフィールドがあります。

Start Date,
End Date, 
Item, 
Type

日数も取得する必要があります

それらを正しくグループ化するには、各行を見て、開始日の日付が連続しているかどうか、それらがグループ化されているかどうか、そうでない場合は別のグループに入るかどうかを確認する必要があります

したがって、次の日付がデータベースにあったとします。

2013-10-23
2013-10-24
2013-10-28
2013-10-29

次に、2行を返す必要があります

2(number of days), 2013-10-23 (startdate) ,2013-10-24 (last consecutive date) , Item, Type
2,2013-10-28,2013-10-29,Item,Type

次に、物事をより複雑なレベルに引き上げるために、アイテムとタイプが同じであることに基づいてグループ化する必要があります

それが次のデータです(StartDate、Item、Type)

2013-10-23,ABC,EFG
2013-10-24,XYZ,WXY
2013-10-28,ABC,EFG
2013-10-29,ABC,EFG

この場合、最初の 2 つはグループ化されません。これは、日付が連続していても、Item や Type が互いに同じではないためです。

ただし、日付が連続しており、Item と Type が互いに同じであるため、最後の 2 つは一緒にグループ化され、必要な結果が得られます。

number of days  startdate   last consecutive date  Item  Type
   1            2013-10-23  2013-10-23             ABC   EFG
   1            2013-10-24  2013-10-24             XYZ   WXY
   2            2013-10-28  2013-10-29             ABC   EFG

これを MySQL で実行しようとしています。PHP を使用してループできることはわかっていますが、可能であれば MySQL で実行することをお勧めします。

これは、いくつかのデータを含む SQLFiddle です。http://sqlfiddle.com/#!2/63383/1/0

4

3 に答える 3

2
SELECT COUNT(*), MIN(startdate), MAX(startdate), item, type FROM (
  SELECT   startdate, item, type,
           @group     := @group + 1 - (
                           type      <=> @last_type
                       AND item      <=> @last_item
                       AND startdate <=> @last_date + INTERVAL 1 DAY
                         ) g,
           @last_type := type,
           @last_item := item,
           @last_date := startdate
  FROM     productinfo, (
             SELECT @group     := 0,
                    @last_type := NULL,
                    @last_item := NULL,
                    @last_date := NULL
           ) init
  ORDER BY type, item, startdate
) t GROUP BY g

sqlfiddleで参照してください。

于 2013-10-26T09:21:50.480 に答える
0

これを試して:

SELECT
    DATEDIFF(MAX(startdate), MIN(startdate)) + 1 AS number_of_days,
    MIN(startdate) AS startdate,
    MAX(startdate) AS last_consecutive_date,
    item,
    type
  FROM (
    SELECT @rownum := @rownum + 1 AS row_number,
           pi.*
    FROM
      productinfo pi,
      (SELECT @rownum := 0) r
  ) mydata
GROUP BY item, type, DATE_ADD(startdate, INTERVAL -row_number DAY)
ORDER BY item, type, DATE_ADD(startdate, INTERVAL -row_number DAY)
;

このスレッドAndriy Mによる回答に基づいています。

SQLFiddle: SQLFiddle の例

于 2013-10-26T09:23:53.533 に答える