Cal c агрегирует по непрерывным группам значений в Redshift - PullRequest
0 голосов
/ 26 февраля 2020

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

У меня есть таблица значений состояния пользователя с датами начала и окончания, которая выглядит следующим образом:

create table #t (userid int4, status varchar(15), start_time date, end_time date);

insert into #t values
(1, 'Active', '2019-08-15', '2019-08-20'),
(1, 'Active', '2019-08-20', '2019-08-22'),
(1, 'Active', '2019-08-22', '2019-09-22'),
(1, 'Inactive', '2019-09-22', '2019-10-22'),
(1, 'At Risk', '2019-10-22', '2019-11-22'),
(1, 'Lapsed', '2019-11-22', '2019-12-08'),
(1, 'Active', '2019-12-08', '2019-12-18'),
(1, 'Active', '2019-12-18', '2020-01-11'),
(1, 'Active', '2020-01-11', '2020-01-15'),
(1, 'Active', '2020-01-15', '2020-02-15'),
(1, 'Inactive', '2020-02-15', '2020-03-15')
;

I пытаюсь суммировать до минимальных / максимальных дат для каждой непрерывной группы значений состояния (при сортировке по времени начала), как показано ниже:

summarized status table

I Я пытался туда попасть, используя оконные функции в Redshift, но я не могу разделить на основе статуса, так как кажется, что это группирует статусы вместе, и я получаю «Active» с 2019-08-15 по 2020-02-15.

1 Ответ

0 голосов
/ 26 февраля 2020

Это так называемый подход с пропусками и островами. Написано на моем телефоне так не проверено. Но вы должны быть в состоянии найти SO для этой ключевой фразы.

WITH
  sorted AS
(
  SELECT
    *, 
    ROW_NUMBER()
      OVER (
        PARTITION BY userid
            ORDER BY start
      )
        AS row_userid_start,
    ROW_NUMBER()
      OVER (
        PARTITION BY userid, status
            ORDER BY start
      )
        AS row_userid_status_start
  FROM
    #t
)
SELECT
  userid,
  status,
  MIN(start)   AS start,
  MAX(end)     AS end
FROM
  sorted
GROUP BY
  userid,
  status,
  row_userid_status_start - row_userid_start
...