【问题标题】:SQL Group By weeks and months in the same time (Redshift)SQL 分组按周和月在同一时间 (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 日等期间的违规次数。

可以使用相同的查询吗?

【问题讨论】:

    标签: sql amazon-redshift


    【解决方案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 两个单独查询的输出来生成这些结果。

      基本规则是一个输入行将映射到(最多)一个输出行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-28
        • 2016-05-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多