2016-06-13 99 views
2

我有一個包含現有數據的表。對於此表第一列中的每個唯一值,我們都有一個應該按順序排列的列,但此表已經失序。我想運行一條SQL語句,將第二列重新排列。我能看到我想要的結果與此SQL:使用Rank()函數更新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列訂單行和重置爲1時,得到的新的FORMULA_ID。但是我不知道如何將其轉換爲UPDATE語句,該語句實際上將WANT_THIS中的值放入列ATTRIB_ORDER中。有沒有辦法將上面的SQL轉換成UPDATE語句?

回答

7

這是一種方式:

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;