Как найти отдельные записи, когда значение было изменено в таблице с ежедневными снимками - PullRequest
1 голос
/ 03 мая 2019

У меня есть таблица с полем SNAP_EFF_DT (дата, когда запись была вставлена ​​в таблицу).Все записи вставляются ежедневно для записи любых изменений, которые может иметь конкретная запись.Я хочу вытащить только даты и значения, когда произошло изменение по сравнению с предыдущей датой.

Я использую помощник Teradata SQL для запроса этих данных.Это то, что я имею до сих пор:

SEL DISTINCT MIN(a.SNAP_EFF_DT) as SNAP_EFF_DT, CLIENT_ID, FAVORITE_COLOR
FROM CUSTOMER_TABLE
GROUP BY 2,3;

Это дает мне первый случай изменения определенного цвета.Тем не менее, если клиенту сначала нравится синий цвет 1 января 2009 года, затем он меняется на зеленый 1 февраля 2009 года, а затем снова становится синим 1 марта 2009 года, я не получу последнее изменение результатов ибудет предполагать, что их текущий любимый цвет - зеленый, тогда как на самом деле он снова стал синим.Мне нужен код, который возвращает все 3 изменения.

Ответы [ 2 ]

2 голосов
/ 03 мая 2019

Просто используйте LAG для сравнения текущего и предыдущего цвета строки:

SELECT t.*,
   LAG(FAVORITE_COLOR)
   OVER (PARTITION BY CLIENT_ID
         ORDER BY SNAP_EFF_DT) AS prev_color
FROM CUSTOMER_TABLE AS t
QUALIFY
   FAVORITE_COLOR <> prev_color
OR prev_color IS NULL

Если ваша версия Teradata не поддерживает LAG, переключитесь на

   MIN(FAVORITE_COLOR)
   OVER (PARTITION BY CLIENT_ID
         ORDER BY SNAP_EFF_DT
         ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS prev_color
0 голосов
/ 03 мая 2019

Один метод использует JOIN

select ct.*
from CUSTOMER_TABLE ct left join
     CUSTOMER_TABLE ctprev
     on ctprev.client_id = ct.client_id AND
        ctprev.SNAP_EFF_DT = ct.SNAP_EFF_DT - interval '1' day
where ctprev.client_id is null or
      (ctprev.FAVORITE_COLOR <> ct.FAVORITE_COLOR or
       . . .
      );

Примечание. Предполагается, что значения не равны null, хотя логика может быть отрегулирована и для обработки null значений.

...