用ROW_NUMBEROVERPARTITION BY ... ORDER BY更新语句

问题描述

我正在尝试使用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

感谢您的帮助。

解决方法

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

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

具有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