আমার কাছে একটি টেবিল রয়েছে (পোস্টগ্রিসকিউএল 9.4 এ) যা দেখতে দেখতে এটি:
CREATE TABLE dates_ranges (kind int, start_date date, end_date date);
INSERT INTO dates_ranges VALUES
(1, '2018-01-01', '2018-01-31'),
(1, '2018-01-01', '2018-01-05'),
(1, '2018-01-03', '2018-01-06'),
(2, '2018-01-01', '2018-01-01'),
(2, '2018-01-01', '2018-01-02'),
(3, '2018-01-02', '2018-01-08'),
(3, '2018-01-05', '2018-01-10');
এখন আমি প্রদত্ত তারিখগুলি এবং প্রতিটি ধরণের জন্য গণনা করতে চাই, dates_ranges
প্রতিটি তারিখ থেকে কয়টি সারি নেমে আসে into জিরোস সম্ভবত বাদ দেওয়া যেতে পারে।
কাঙ্ক্ষিত ফলাফল:
+-------+------------+----+
| kind | as_of_date | n |
+-------+------------+----+
| 1 | 2018-01-01 | 2 |
| 1 | 2018-01-02 | 2 |
| 1 | 2018-01-03 | 3 |
| 2 | 2018-01-01 | 2 |
| 2 | 2018-01-02 | 1 |
| 3 | 2018-01-02 | 1 |
| 3 | 2018-01-03 | 1 |
+-------+------------+----+
আমি দুটি সমাধান নিয়ে এসেছি, একটি সঙ্গে LEFT JOIN
এবংGROUP BY
SELECT
kind, as_of_date, COUNT(*) n
FROM
(SELECT d::date AS as_of_date FROM generate_series('2018-01-01'::timestamp, '2018-01-03'::timestamp, '1 day') d) dates
LEFT JOIN
dates_ranges ON dates.as_of_date BETWEEN start_date AND end_date
GROUP BY 1,2 ORDER BY 1,2
এবং এর সাথে একটি LATERAL
, যা সামান্য দ্রুত:
SELECT
kind, as_of_date, n
FROM
(SELECT d::date AS as_of_date FROM generate_series('2018-01-01'::timestamp, '2018-01-03'::timestamp, '1 day') d) dates,
LATERAL
(SELECT kind, COUNT(*) AS n FROM dates_ranges WHERE dates.as_of_date BETWEEN start_date AND end_date GROUP BY kind) ss
ORDER BY kind, as_of_date
আমি ভাবছি এই কোয়েরিটি লেখার আরও ভাল উপায় কি? এবং 0 টি গণনার সাথে কীভাবে জোড়গুলি তারিখ-জাতীয় অন্তর্ভুক্ত করবেন?
বাস্তবে কয়েকটি স্বতন্ত্র ধরণের রয়েছে, পাঁচ বছর অবধি (1800 তারিখ) এবং dates_ranges
টেবিলে 30 ডলার সারি (তবে এটি উল্লেখযোগ্যভাবে বৃদ্ধি পেতে পারে)।
কোনও সূচী নেই। আমার ক্ষেত্রে সুনির্দিষ্ট হওয়ার জন্য এটি subquery এর ফলাফল, তবে আমি প্রশ্নটি একটি ইস্যুতে সীমাবদ্ধ করতে চেয়েছিলাম, সুতরাং এটি আরও সাধারণ।
2018-01-31
বা 2018-01-30
বা 2018-01-29
প্রথম পরিসীমা তাদের সব আছে যখন এটি কি আপনি?
generate_series
বহিরাগত প্যারামিটারগুলি রয়েছে - তারা অগত্যা সমস্ত dates_ranges
সারণিকে সারণীতে আবরণ করে না । প্রথম প্রশ্নের হিসাবে আমি মনে করি আমি এটি বুঝতে পারি না - সারিগুলি dates_ranges
স্বাধীন, আমি ওভারল্যাপিং নির্ধারণ করতে চাই না।
(1,2018-01-01,2018-01-15)
এবং(1,2018-01-20,2018-01-25)
আপনার কতগুলি ওভারল্যাপিং তারিখ রয়েছে তা নির্ধারণ করার সময় আপনি কি তা বিবেচনায় নিতে চান?