1

予約のあるテーブルがあります:

  • id (整数)
  • 数量 (tinyint)
  • date_start (タイムスタンプ)
  • date_end (タイムスタンプ)

予約は重複する可能性があるため、たとえば同時に 20 件の予約が発生する可能性があります。ここで、次の 2 つのクエリを実行します。

1)一定期間内の数量の最大合計を取得します。

2)一定期間内の数量の最小合計を取得します。

重複しない予約ではなく、重複する予約のみの数量を追加する方法がわかりません。どんな助けでも大歓迎です。

編集:わかりやすくするために絵を描きました:http://i.imgur.com/8GDLV.png

4

2 に答える 2

2
  1. 希望する期間に発生するすべての予約境界(つまり、開始日と終了日)のリストを作成します。

      SELECT date_start AS boundary
      FROM   bookings
      WHERE  date_start BETWEEN @start AND @end
    UNION
      SELECT date_end
      FROM   bookings
      WHERE  date_end BETWEEN @start AND @end
    
  2. それに、希望する期間の直前に発生する境界を追加します。

    -- [ from part 1 above ]
    UNION
      SELECT MAX(boundary)
      FROM (
        SELECT MAX(date_start) AS boundary
        FROM   bookings
        WHERE  date_start <= @start
      UNION ALL
        SELECT MAX(date_end)
        FROM   bookings
        WHERE  date_end <= @end
      ) t
    
  3. この結果とテーブルの間に外部結合を作成し、すべての境界を保持しますが、境界bookingsの同時人数に寄与する場合にのみ予約を含めます。

    FROM bookings RIGHT JOIN (
      -- [ from part 2 above ]
    ) t ON date_start <= boundary AND boundary < date_end
    
  4. 各境界の人数を合計します。

    SELECT IFNULL(SUM(quantity),0) AS simultaneous_people
    -- [ from part 3 above ]
    GROUP BY boundary
    
  5. 最大値と最小値を見つけます。

    SELECT MIN(simultaneous_people),
           MAX(simultaneous_people)
    FROM (
      -- [ from part 4 above ]
    ) t
    

すべてを一緒に入れて:

SELECT MIN(simultaneous_people),
       MAX(simultaneous_people)
FROM (
  SELECT IFNULL(SUM(quantity),0) AS simultaneous_people
  FROM   bookings RIGHT JOIN (
    SELECT date_start AS boundary
    FROM   bookings
    WHERE  date_start BETWEEN @start AND @end
  UNION
    SELECT date_end
    FROM   bookings
    WHERE  date_end BETWEEN @start AND @end
  UNION
    SELECT MAX(boundary)
    FROM (
      SELECT MAX(date_start) AS boundary
      FROM   bookings
      WHERE  date_start <= @start
    UNION ALL
      SELECT MAX(date_end)
      FROM   bookings
      WHERE  date_end <= @end
    ) t
  ) t ON date_start <= boundary AND boundary < date_end
  GROUP BY boundary
) t

sqlfiddleでそれを参照してください。

于 2012-08-31T11:16:42.647 に答える
1

質問の特定のデータ構造にグループ化するためのフィールドはありません。したがって、 でグループ化していると仮定しますID

1)。最大限に活用するにはMAX

SELECT MAX(TotalQty) FROM
(
    SELECT SUM(Quantity) AS TotalQty FROM Bookings
    WHERE date_End<='<To Date>'
    AND date_Start>='<From Date>'
    GROUP BY id
) SumQty

2)。最大最小を取得するにはMIN

SELECT MIN(TotalQty) FROM
(
    SELECT SUM(Quantity) AS TotalQty FROM Bookings
    WHERE date_End<='<To Date>'
    AND date_Start>='<From Date>'
    GROUP BY id
) SumQty

このSQLFiddleを参照してください

于 2012-08-31T10:43:09.540 に答える