SQL组同时按周和月(Redshift)

时间:2018-05-29 15:42:36

标签: sql amazon-redshift

在下面的代码中,我选择了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日期间的违规次数等。

可以使用相同的查询吗?

2 个答案:

答案 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>