将此SQL查询转换为ANSI SQL

将此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”语句。让我知道我的逻辑是否正确,或者给我指出正确的方向 此

我想将此SQL查询转换为ANSI SQL。我很难理解这个问题的逻辑

我使用Snowflake Data Warehouse,但它不理解此查询,因为在join之前有“delete”语句,所以我尝试将其分解。据我所知,行号列根据时间戳给出了从1到N的顺序,并将其放在C中。然后C在除第一行(基于id)之外的其他行上与其自身相连,并放在C1中。然后从整体数据中删除C1,只留下第一行

我可能错误地理解了逻辑,但我不习惯在连接之前看到“delete”语句。让我知道我的逻辑是否正确,或者给我指出正确的方向

此查询是从stackoverflow问题复制/粘贴的,该问题与我试图解决的情况完全相同,但规模要大得多

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并创建一个新表。如果这是一件正在进行的事情,那么您可能希望在基表上创建一个物化视图。