在下面的代码中,我选择了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日期间的违规次数等。
可以使用相同的查询吗?
答案 0 :(得分:1)
您需要UNION
两个单独查询的输出才能生成这些结果。
基本规则是一个输入行将映射到(最多)一个输出行。
答案 1 :(得分:1)
您可以使用WITH子查询执行此操作,这将允许您根据逻辑在数据库和组上运行一次查询。
您的查询在列名称之间存在一些断开连接,但同样会看起来像这样
P.S。 Union要求两个列中的列数应相同
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>