将此 SQL 查询转换为 ANSI SQL



我想将此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
);

如果这是您的意图,您的查询不会执行此操作。

最新更新