2016-06-13 4 views
2

У меня есть таблица с существующими данными. Для каждого уникального значения в первом столбце этой таблицы у нас есть столбец, который должен находиться в последовательном порядке, но эта таблица вышла из строя. Я хочу запустить инструкцию SQL, которая вернет этот второй столбец. Я был в состоянии видеть результаты, я хочу с этим SQL:Обновить столбец SQL с помощью функции Rank()

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; 
Смежные вопросы