【发布时间】:2013-04-09 16:08:48
【问题描述】:
我有一张包含以下信息的表格
|date | user_id | week_beg | month_beg|
使用测试值创建表的 SQL:
CREATE TABLE uniques
(
date DATE,
user_id INT,
week_beg DATE,
month_beg DATE
)
INSERT INTO uniques VALUES ('2013-01-01', 1, '2012-12-30', '2013-01-01')
INSERT INTO uniques VALUES ('2013-01-03', 3, '2012-12-30', '2013-01-01')
INSERT INTO uniques VALUES ('2013-01-06', 4, '2013-01-06', '2013-01-01')
INSERT INTO uniques VALUES ('2013-01-07', 4, '2013-01-06', '2013-01-01')
输入表:
| date | user_id | week_beg | month_beg |
| 2013-01-01 | 1 | 2012-12-30 | 2013-01-01 |
| 2013-01-03 | 3 | 2012-12-30 | 2013-01-01 |
| 2013-01-06 | 4 | 2013-01-06 | 2013-01-01 |
| 2013-01-07 | 4 | 2013-01-06 | 2013-01-01 |
输出表:
| date | time_series | cnt |
| 2013-01-01 | D | 1 |
| 2013-01-01 | W | 1 |
| 2013-01-01 | M | 1 |
| 2013-01-03 | D | 1 |
| 2013-01-03 | W | 2 |
| 2013-01-03 | M | 2 |
| 2013-01-06 | D | 1 |
| 2013-01-06 | W | 1 |
| 2013-01-06 | M | 3 |
| 2013-01-07 | D | 1 |
| 2013-01-07 | W | 1 |
| 2013-01-07 | M | 3 |
我想计算一个日期的不同 user_id 的数量:
在那一天
截至该日期的那一周(Week to date)
截至该日期的月份(Month to date)
1 很容易计算。 对于 2 和 3,我正在尝试使用此类查询:
SELECT
date,
'W' AS "time_series",
(COUNT DISTINCT user_id) COUNT (user_id) OVER (PARTITION BY week_beg) AS "cnt"
FROM user_subtitles
SELECT
date,
'M' AS "time_series",
(COUNT DISTINCT user_id) COUNT (user_id) OVER (PARTITION BY month_beg) AS "cnt"
FROM user_subtitles
Postgres 不允许用于 DISTINCT 计算的窗口函数,因此这种方法不起作用。
我也尝试了 GROUP BY 方法,但它不起作用,因为它给了我整周/月的数字。
解决这个问题的最佳方法是什么?
【问题讨论】:
-
请分享一些输入数据及其预期输出
-
@Akash 我添加了信息,谢谢
标签: sql postgresql date correlated-subquery window-functions