每日快照中如何更改表中的值时如何查找不同的记录

时间:2019-05-03 18:39:27

标签: sql teradata

我有一个表,该表具有SNAP_EFF_DT(记录插入到表中的日期)字段。每天都会插入所有记录,以记录特定记录可能具有的任何更改。我只想从以前的日期进行更改时只提取日期和值。

我正在使用Teradata SQL Assistant查询此数据。这是我到目前为止的内容:

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

这确实为我提供了更改为特定颜色的第一个实例。但是,如果客户首先喜欢1/1/2019的蓝色,然后在2/1/2019更改为绿色,然后在3/1/2019变回蓝色,则结果不会得到最后的更改,并且会假设他们当前喜欢的颜色是绿色,而实际上它又变回了蓝色。我想要一个返回所有3个更改的代码。

2 个答案:

答案 0 :(得分:2)

只需使用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

答案 1 :(得分:0)

一种方法使用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