Postgresql

按任意月時間段分組

  • August 18, 2019

我想按使用者定義的時間段對以下數據進行分組:

+------------+--------+
|    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/

引用自:https://dba.stackexchange.com/questions/245414