我想将此SQL查询转换为ANSI SQL。我无法理解此查询的逻辑。
我使用 Snowflake 数据仓库,但由于连接前的"delete"语句,它无法理解此查询,因此我正在尝试分解它。据我了解,行号列根据时间戳给我从 1 到 N 的顺序并将其放在 C 中。然后,C 在第一行以外的行(基于 id(上与自身连接并放置在 C1 中。然后从整体数据中删除 C1,只留下第一行。
我可能错误地理解了逻辑,但我不习惯在连接之前看到"删除"语句。让我知道我的逻辑是否正确,或者指出我正确的方向。
此查询是从 THIS 堆栈溢出问题复制/粘贴的,该问题具有我试图解决的确切情况,但规模要大得多。
with C as
(
select ID,
row_number() over(order by DT) as rn
from YourTable
)
delete C1
from C as C1
inner join C as C2
on C1.rn = C2.rn-1 and
C1.ID = C2.ID
我试图解决的具体问题是这个。假设我有这张表。我需要按主键组合(primKey 1 和 2(对行进行分区,同时保持时间戳顺序。
ID primKey1 primKey2 checkVar1 checkVar2 theTimestamp
100 1 2 302 423 2001-07-13
101 3 6 506 236 2005-10-25
100 1 2 302 423 2002-08-15
101 3 6 506 236 2008-12-05
101 3 6 300 100 2010-06-10
100 1 2 407 309 2005-09-05
100 1 2 302 423 2012-05-09
100 1 2 302 423 2003-07-24
一旦对行进行分区并且时间戳在每个分区中排序,我需要删除重复的 checkVar 组合(checkVar 1 和 2(行,直到下一次更改。从而给我留下了最早的唯一行。带星号的行是需要删除的行,因为它们是重复的。
ID primKey1 primKey2 checkVar1 checkVar2 theTimestamp
100 1 2 302 423 2001-07-13
*100 1 2 302 423 2002-08-15
*100 1 2 302 423 2003-07-24
100 1 2 407 309 2005-09-05
100 1 2 302 423 2012-05-09
101 3 6 506 236 2005-10-25
*101 3 6 506 236 2008-12-05
101 3 6 300 100 2010-06-10
这是最终结果。正如您在 ID=100 时所看到的,即使第 1 条和第 3 条记录相同,checkVar 组合也会在两者之间发生变化,这很好。我只是删除重复项,直到值发生变化。
ID primKey1 primKey2 checkVar1 checkVar2 theTimestamp
100 1 2 302 423 2001-07-13
100 1 2 407 309 2005-09-05
100 1 2 302 423 2012-05-09
101 3 6 506 236 2005-10-25
101 3 6 300 100 2010-06-10
如果要保留每个id
的最早行,则可以使用:
delete from yourtable yt
where yt.dt > (select min(yt2.dt)
from yourtable yt
where yt2.id = yd.id
);
如果这是您的意图,您的查询不会执行此操作。