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)的主要内容,如果未能解决你的问题,请参考以下文章

使用 concat 按周分组 SQL

从星期三开始按周分组的 SQL

如何在oracle sql developer中按年和月分组获取当前财政年度的数据?

请问DB2里面的SQL查询语句按周分组是怎么写的

在mysql中计算数据并按周分组

如何使用 Django ORM 按周分组