SQL 分组按周和月在同一时间 (Redshift)
Posted
技术标签:
【中文标题】SQL 分组按周和月在同一时间 (Redshift)【英文标题】:SQL Group By weeks and months in the same time (Redshift) 【发布时间】:2018-05-29 15:42:35 【问题描述】:在下面的代码中,我选择了 42 天期间并按 SNAPSHOT_WEEK 分组(其中 SNAPSHOT_WEEK 在一年中的数字从 1 到 52(53))。
SELECT
CASE
WHEN video_code = 'A' THEN 'Seller'
WHEN video_code = 'B' THEN 'Vendor'
WHEN video_code = 'C' THEN 'Others'
END AS CATEGORY
TO_CHAR(snapshot_time - DATE_PART('dow', snapshot_time)::int + 4, 'IW') AS SNAPSHOT_WEEK,
SUM(VIOLATION_COUNT)
FROM my_table
WHERE 1=1
AND snapshot_time BETWEEN '20180505'::date - '41 days'::interval AND '20180505'::date -- to calculate WoW
GROUP BY
CATEGORY, SNAPSHOT_WEEK;
此查询的输出如下所示:
CATEGORY WEEK OR MONTH SUM_VIOLATION_COUNT
A 14 954
B 14 454
C 14 299
A 15 954
B 16 454
是否有可能,在同一个查询中,除了按周分组之外,还按月对数据进行分组,其中月份应该从一个月的 28 日开始到第二个月的 28 日?
例如,在我的输出中,我需要显示以下值的列:
CATEGORY WEEK OR MONTH SUM_VIOLATION_COUNT
A 14 954
B 14 454
C 14 299
A 15 954
B 16 454
C 17 299
A 28 March 9354
B 28 March 2454
C 28 March 5354
A 28 April 1354
...... ..... .....
其中“3 月 28 日” - 表示 2 月 28 日至 3 月 28 日之间的违规次数; “4 月 28 日” - 2 月 28 日至 4 月 28 日等期间的违规次数。
可以使用相同的查询吗?
【问题讨论】:
【参考方案1】:您可以使用 WITH 子查询来做到这一点,这将允许您在数据库上运行一次查询并根据您的逻辑分组两次。
您的查询在您的列名之间存在一些脱节,但它再次看起来像这样
附:联合要求两个选择中的列数应该相同
WITH ALLDATA AS (
SELECT
CASE
WHEN video_code = 'A' THEN 'Seller'
WHEN video_code = 'B' THEN 'Vendor'
WHEN video_code = 'C' THEN 'Others'
END AS CATEGORY
TO_CHAR(snapshot_time - DATE_PART('dow', snapshot_time)::int + 4, 'IW') AS SNAPSHOT_WEEK,
SUM(VIOLATION_COUNT) SUM_VIOLATION_COUNT
FROM my_table
WHERE 1=1
AND snapshot_time BETWEEN '20180505'::date - '41 days'::interval AND '20180505'::date -- to calculate WoW
GROUP BY
CATEGORY, SNAPSHOT_WEEK)
SELECT CATEGORY, SNAPSHOT_WEEK, SUM_VIOLATION_COUNT FROM ALLDATA
UNION
SELECT CATEGORY, SNAPSHOT_WEEK, SUM_VIOLATION_COUNT FROM ALLDATA
GROUP BY <your month grouping logic>
用伪代码重申逻辑
WITH ALLDATA AS (
SELECT <your base data without group by> )
SELECT columns FROM ALLDATA
GROUP BY <weekly group by logic>
UNION
SELECT columns FROM ALLDATA
GROUP BY <monthly group by logic>
【讨论】:
【参考方案2】:您需要UNION
两个单独查询的输出来生成这些结果。
基本规则是一个输入行将映射到(最多)一个输出行。
【讨论】:
以上是关于SQL 分组按周和月在同一时间 (Redshift)的主要内容,如果未能解决你的问题,请参考以下文章