Redshift Проверьте, существует ли значение текущей записи в следующем разделе - PullRequest
0 голосов
/ 24 января 2020

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

userid|       time          | product  
    -----|---------------------|-----

      1  | 2020-01-10 8:00:00  | A
      1  | 2020-01-10 9:00:00  | B
      1  | 2020-01-10 9:00:00  | A
      1  | 2020-01-10 10:00:00 | C
      1  | 2020-01-10 10:00:00 | B
      1  | 2020-01-10 11:00:00 | D
      1  | 2020-01-10 11:00:00 | E
      1  | 2020-01-10 11:00:00 | A  

Output_Table

userid|       time          | product | Is_Repeated?
    -----|---------------------|-----|---------

      1  | 2020-01-10 8:00:00  | A  | 1
      1  | 2020-01-10 9:00:00  | B  | 1
      1  | 2020-01-10 9:00:00  | A  | 0
      1  | 2020-01-10 10:00:00 | C  | 0
      1  | 2020-01-10 10:00:00 | B  | 1
      1  | 2020-01-10 11:00:00 | D  | 0
      1  | 2020-01-10 11:00:00 | B  | 0
      1  | 2020-01-10 11:00:00 | A  | 0

Ниже я пытаюсь найти следующую запись в разделе вместо каждой записи в следующем разделе и возвращает 0 в моем флаге для каждого запись.

SELECT userid, time, product, 
 CASE WHEN Lead(product) OVER (partition by userid order by time) = product THEN 1 else 0 END  as Is_Repeated?
FROM Input_table

Ответы [ 2 ]

0 голосов
/ 25 января 2020

Судя по вашим данным, «следующий раздел» означает около часа. Если это так, логика c будет:

SELECT userid, "time", product, 
       (CASE WHEN LEAD(time) OVER (partition by userid, product ORDER BY time) < time + INTERVAL '2 hour'
             THEN 1 ELSE 0
        END)  as "Is_Repeated?"
FROM Input_table;

Исходя из пояснения в вашем комментарии:

SELECT userid, "time", product, 
       (CASE WHEN LEAD(time) OVER (partition by userid, product ORDER BY time) =
                  LEAD(time) OVER (partition by userid ORDER BY time)
             THEN 1 ELSE 0
        END)  as "Is_Repeated?"
FROM Input_table;
0 голосов
/ 24 января 2020

Повторите запрос, но упорядочите по продукту и времени. Для флага вам нужен один случай, поэтому, если он повторяется, вы получите его:

Эта проверка, только если есть повторение, следующее

with Input_table as
(
select 1 as userid,'2020-01-10 8:00:00' as time, 'A' as product
union select 1  ,'2020-01-10 9:00:00', 'B'
union select  1  ,'2020-01-10 9:00:00', 'A'
union select  1  ,'2020-01-10 10:00:00', 'C'
union select   1  ,'2020-01-10 10:00:00', 'B'
union select   1  ,'2020-01-10 11:00:00', 'D'
union select  1 ,'2020-01-10 11:00:00', 'E'
union select  1  ,'2020-01-10 11:00:00', 'A' 
),
cte2 as
(
SELECT userid, "time", product, 
 CASE WHEN Lead(product) OVER (partition by userid order by product, time) = product THEN 1 else 0 END  as "Is_Repeated?"
FROM Input_table
)  
select * from cte2 order by time

, если вы хотите пометить все повторное использование :

    with Input_table as
    (
    select 1 as userid,'2020-01-10 8:00:00' as time, 'A' as product
    union select 1  ,'2020-01-10 9:00:00', 'B'
    union select  1  ,'2020-01-10 9:00:00', 'A'
    union select  1  ,'2020-01-10 10:00:00', 'C'
    union select   1  ,'2020-01-10 10:00:00', 'B'
    union select   1  ,'2020-01-10 11:00:00', 'D'
    union select  1 ,'2020-01-10 11:00:00', 'E'
    union select  1  ,'2020-01-10 11:00:00', 'A' 
    ),
    cte2 as
    (
    SELECT userid, "time", product, 
     CASE WHEN Lead(product) OVER (partition by userid order by product, time) = product THEN 1 else 0 END  as "Is_Repeated?"
    FROM Input_table
    ),
 cte3 as
 (
    select userid, product, max("Is_Repeated?") as "Is_Repeated?" from cte2 group by userid, product
 )
 select a.userid, a.product, "time", "Is_Repeated?"
 from Input_table a inner join cte3 b on a.userid = b.userid and  a.product = b.product order by "time"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...