问题描述
我正在尝试使用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