-
वांछित अवधि में होने वाली सभी बुकिंग सीमाओं (अर्थात प्रारंभ और समाप्ति तिथि) की एक सूची तैयार करें:
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
-
उस सीमा को जोड़ें जो वांछित अवधि से ठीक पहले होती है:
-- [ 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
-
इस परिणाम और
bookings
. के बीच एक बाहरी जुड़ाव बनाएं तालिका, सभी सीमाओं को ध्यान में रखते हुए, लेकिन केवल एक बुकिंग सहित यदि यह एक साथ लोगों की संख्या में योगदान देता है बाद सीमा:FROM bookings RIGHT JOIN ( -- [ from part 2 above ] ) t ON date_start <= boundary AND boundary < date_end
-
प्रत्येक सीमा पर लोगों की संख्या का योग करें:
SELECT IFNULL(SUM(quantity),0) AS simultaneous_people -- [ from part 3 above ] GROUP BY boundary
-
अधिकतम और न्यूनतम खोजें:
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 पर देखें ।