Группа SQL По неделям и месяцам одновременно (Redshift) - PullRequest
0 голосов
/ 29 мая 2018

В приведенном ниже коде я выбираю 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
  ......       .....         .....

Где «28 марта» - число нарушений в период с 28 февраля по 28 марта;«28 апреля» - число нарушений в период с 28 февраля по 28 апреля и т. Д.

Возможно ли сделать этот же запрос?

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Вы можете сделать это с WITH Subquery, это позволит вам выполнить запрос один раз для базы данных и сгруппировать два раза на основе вашей логики.

В вашем запросе есть некоторые разногласия между именами столбцов, но сноваэто будет выглядеть примерно так

PS 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>
0 голосов
/ 30 мая 2018

Для генерации этих результатов вам потребуется UNION вывод двух отдельных запросов.

Основное правило состоит в том, что одна входная строка будет отображаться (максимум) в одну выходную строку.

...