将此SQL查询转换为ANSI SQL
我想将此SQL查询转换为ANSI SQL。我很难理解这个问题的逻辑 我使用Snowflake Data Warehouse,但它不理解此查询,因为在join之前有“delete”语句,所以我尝试将其分解。据我所知,行号列根据时间戳给出了从1到N的顺序,并将其放在C中。然后C在除第一行(基于id)之外的其他行上与其自身相连,并放在C1中。然后从整体数据中删除C1,只留下第一行 我可能错误地理解了逻辑,但我不习惯在连接之前看到“delete”语句。让我知道我的逻辑是否正确,或者给我指出正确的方向 此查询是从stackoverflow问题复制/粘贴的,该问题与我试图解决的情况完全相同,但规模要大得多将此SQL查询转换为ANSI SQL,sql,snowflake-cloud-data-platform,Sql,Snowflake Cloud Data Platform,我想将此SQL查询转换为ANSI SQL。我很难理解这个问题的逻辑 我使用Snowflake Data Warehouse,但它不理解此查询,因为在join之前有“delete”语句,所以我尝试将其分解。据我所知,行号列根据时间戳给出了从1到N的顺序,并将其放在C中。然后C在除第一行(基于id)之外的其他行上与其自身相连,并放在C1中。然后从整体数据中删除C1,只留下第一行 我可能错误地理解了逻辑,但我不习惯在连接之前看到“delete”语句。让我知道我的逻辑是否正确,或者给我指出正确的方向 此
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
);
如果这是您的意图,您的查询将不会执行此操作。请解释您要实现的逻辑。从查询中看不出这一点。基于CTE的删除是Sql Server可以使用的方法之一,但在其他DBMS上则不行。但是对于标准SQL,可能需要一个表中唯一的额外字段。显然,该ID不是该表中的主键,因为它有DUP。嘿,Gordon和LukStorms。我编辑了这个问题,以显示我正在努力完成的任务。虽然在我的情况下,主键没有真正的概念,因为我使用的主键不是唯一的。它们主要用于分区目的。尽管如此,主键和时间戳的组合始终是唯一的。您是要从CTE还是从表中删除?如果这是一次性的,您可能只需要使用CTA并创建一个新表。如果这是一件正在进行的事情,那么您可能希望在基表上创建一个物化视图。