【问题标题】:Update Statement with ROW_NUMBER () OVER(PARTITION BY... ORDER BY)使用 ROW_NUMBER () OVER(PARTITION BY... ORDER BY) 更新语句
【发布时间】:2020-08-17 14:51:34
【问题描述】:

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

感谢您的帮助。

【问题讨论】:

  • 那么,你有什么?为什么它没有按预期工作?
  • 为什么要使用在运行时始终可以计算的值来更新表?这只是意味着每当 任何行 更改时,您都必须始终保持它为最新的所有行。除非您阅读该值的次数远远多于更新此表中的任何内容,否则这是一种浪费。

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


【解决方案1】:

如果您尝试根据之前的记录进行更新,lead 函数将帮助而不是 row_number

SELECT LEAD( 1) OVER (
        PARTITION BY ENTITY_NAME  ,INSURANCE_CO
        ORDER BY EFF_DATE
    ) ,*
    FROM Table_name 
    ORDER BY  ROW_NO  

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-02
      • 2012-09-23
      • 1970-01-01
      • 2014-10-23
      • 2013-02-24
      • 1970-01-01
      • 2014-05-08
      相关资源
      最近更新 更多