我有一个表,该表具有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个更改的代码。
答案 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
。