用ROW_NUMBER()OVER(PARTITION BY ... ORDER BY)更新语句

时间:2020-08-17 14:51:34

标签: sql sql-server sql-server-2017

我正在尝试使用ROW_NUMBER()OVER(PARTITION BY ... ORDER BY)编写更新语句

这是我桌子的样品:

ROW_NO   ENTITY_ID   ENTITY_NAME   EFF_DATE     INSURANCE_CO   SCENARIO_ID   
1        352725      ABC COMPANY   10/20/2000   999            NULL
2        352732      ABC COMPANY   7/1/2002     888            NULL
3        352736      ABC COMPANY   8/6/2004     999            NULL
4        865867      ABC COMPANY   10/16/2007   888            NULL

我使用ROW_NUMBER()OVER(PARTITION BY ENTITY_NAME ORDER BY EFF_DATE ASC)“ ROW_NO”来获取ROW_NO

我想做的是设置SCENARIO_ID = 1,其中上一行的INSURANCE_CO = 999。

这是我想要达到的结果:

ROW_NO   ENTITY_ID   ENTITY_NAME   EFF_DATE     INSURANCE_CO   SCENARIO_ID   
1        352725      ABC COMPANY   10/20/2000   999            NULL
2        352732      ABC COMPANY   7/1/2002     888            1
3        352736      ABC COMPANY   8/6/2004     999            NULL
4        865867      ABC COMPANY   10/16/2007   888            1

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

如果您尝试根据以前的记录进行更新,则线索功能将代替行号提供帮助

parser = etree.XMLParser(remove_blank_text=True)
formatTree = etree.parse(self.file, parser)
formatTree.write(self.file, pretty_print=True)

答案 1 :(得分:0)

具有LAG()窗口功能:

WITH cte AS (
  SELECT *, LAG(INSURANCE_CO) OVER(PARTITION BY ENTITY_NAME ORDER BY EFF_DATE ASC) prev
  FROM tablename
)
UPDATE cte
SET SCENARIO_ID = 1
WHERE prev = '999'

请参见demo
结果:

> ROW_NO | ENTITY_ID | ENTITY_NAME | EFF_DATE                | INSURANCE_CO | SCENARIO_ID
> -----: | --------: | :---------- | :---------------------- | -----------: | :----------
>      1 |    352725 | ABC COMPANY | 2000-10-20 00:00:00.000 |          999 | null       
>      2 |    352732 | ABC COMPANY | 2002-07-01 00:00:00.000 |          888 | 1          
>      3 |    352736 | ABC COMPANY | 2004-08-06 00:00:00.000 |          999 | null       
>      4 |    865867 | ABC COMPANY | 2007-10-16 00:00:00.000 |          888 | 1