【问题标题】:Update SQL column using Rank() function使用 Rank() 函数更新 SQL 列
【发布时间】:2016-10-14 09:56:57
【问题描述】:

我有一个包含现有数据的表。对于该表第一列中的每个唯一值,我们有一个应该按顺序排列的列,但该表已乱序。我想运行一条 SQL 语句,将第二列按顺序放回原处。我可以通过这个 SQL 看到我想要的结果:

select FORMULA_ID, ATTRIB_CODE, ATTRIB_VAL, ATTRIB_ORDER,
rank() over (partition by formula_id order by attrib_code, attrib_val) AS WANT_THIS
from ATTRIB

产量:

 FORMULA_ID  ATTRIB_CODE          ATTRIB_VAL       ATTRIB_ORDER WANT_THIS
 ----------- -------------------- ---------------- ------------ ---------
 2791        C_BRAND              ROMAN HOLIDAY    3            1
 2791        C_ENDUSE             DINNER           4            2
 2791        C_ENDUSE             SNACK            6            3
 2791        C_ENDUSER            10-17            7            4
 2791        C_PRODTYPE           SALAD            13           5
 2791        C_RELIG              ANY              14           6
 2821        C_ALLERGEN           PEANUT           1            1
 2821        C_ALLERGEN           SOY              2            2
 2821        C_BRAND              ROMAN HOLIDAY    1            3
 2821        C_ENDUSE             DINNER           1            4

如您所见,WANT_THIS 列对行进行排序并在获得新的 FORMULA_ID 时重置为 1。但我不知道如何将其转换为 UPDATE 语句,该语句实际上会将 WANT_THIS 中的值放入 ATTRIB_ORDER 列中。有没有办法将上面的 SQL 转换成 UPDATE 语句?

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    这是一种方式:

    WITH CTE AS
    (
        SELECT  FORMULA_ID, 
                ATTRIB_CODE, 
                ATTRIB_VAL, 
                ATTRIB_ORDER,
                RANK() OVER (PARTITION BY formula_id 
                             ORDER BY attrib_code, attrib_val) AS WANT_THIS
        FROM ATTRIB
    )
    UPDATE CTE
    SET ATTRIB_ORDER = WANT_THIS;
    

    【讨论】:

    • 即使语句说“UPDATE CTE SET...”,您是否真的在更新真实表??
    • CTE 是视图而不是临时表,因此您可以通过这种方式更新基础表。 CTE用于删除表中的重复记录,使用row_number where row_number 1.
    猜你喜欢
    • 1970-01-01
    • 2022-11-10
    • 2017-07-25
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多