Postgresql
按任意月時間段分組
我想按使用者定義的時間段對以下數據進行分組:
+------------+--------+ | DATE | Amount | +------------+--------+ | 2019-03-12 | 300 | | 2019-03-15 | 1500 | | 2019-03-25 | 2500 | | 2019-03-25 | 3000 | | 2019-04-04 | 5000 | | 2019-04-27 | 10000 | +------------+--------+
但是,期間的開始和結束不必與日曆月的開始和結束一致,例如:
使用者 A:期間開始於月初,期間結束於月末
使用者 B: 月 15 日開始,次月 14 日結束
使用者 C: 期初 7 號,期末 6 號
所以:
使用者 A:
+--------------+--------+ | Period Start | Amount | +--------------+--------+ | 2019-01-01 | 0 | | 2019-02-01 | 0 | | 2019-03-01 | 7300 | | 2019-04-01 | 15000 | | 2019-05-01 | 0 | | 2019-06-01 | 0 | | ... | ... | +--------------+--------+
使用者乙:
+--------------+--------+ | Period Start | Amount | +--------------+--------+ | 2019-01-15 | 0 | | 2019-02-15 | 300 | | 2019-03-15 | 12000 | | 2019-04-15 | 10000 | | 2019-05-15 | 0 | | 2019-06-15 | 0 | | ... | ... | +--------------+--------+
使用者 C:
+--------------+--------+ | Period Start | Amount | +--------------+--------+ | 2019-01-07 | 0 | | 2019-02-07 | 0 | | 2019-03-07 | 12300 | | 2019-04-07 | 10000 | | 2019-05-07 | 0 | | 2019-06-07 | 0 | | ... | ... | +--------------+--------+
這可以以與供應商無關的方式完成嗎?如果沒有,請告訴我如何在 PostgreSQL 10.x 和 - 如果可能 - 在 HSQLDB 2.4.x 中完成。
有許多不同的方法可以做到這一點,但如果你只需要它是從給定日期開始的每月時間段,我會使用一個變數來表示當月的某一天開始,然後只計算那個月份的新列. 就像是:
DECLARE @DayStart TINYINT WITH cteMonth AS ( SELECT DateColumn, CASE WHEN @DayStart < DAY(DateColumn) THEN CASE WHEN MONTH(DateColumn) = 1 THEN CAST(YEAR(DateColumn) - 1 AS VARCHAR(4)) + '/12' ELSE CAST(YEAR(DateColumn) AS VARCHAR(4)) + '/' + CAST(MONTH(DateColumn) - 1 AS VARCHAR(2)) END ELSE CAST(YEAR(DateColumn) AS VARCHAR(4)) + '/' + CAST(MONTH(DateColumn) AS VARCHAR(2)) END AS DateMonth FROM SomeTable ) SELECT DateMonth, [aggregate columns] FROM cteMonth GROUP BY DateMonth
抱歉這是 T-SQL 語法(我不是 PL/SQL 人),但如果您在聲明變數方面需要幫助: http ://www.postgresqltutorial.com/plpgsql-variables/