сбросить индекс в density_rank или row_number после разделения переменных на изменения - PullRequest
0 голосов
/ 18 марта 2020

Я использую DB2 SQL. У меня есть следующее:

select * from mytable order by Var,Varseq

ID    Var    Varseq
--    ---    ------
1     A      1
1     A      2
1     B      1
1     A      3
2     A      1
2     C      1

, но хотелось бы получить:

ID    Var    Varseq    NewSeq
--    ---    ------    ------
1     A      1         1
1     A      2         2
1     B      1         1
1     A      3         1
2     A      1         1
2     C      1         1

Однако dense_rank выдает то же, что и исходный результат. Я надеюсь, что вы видите разницу в желаемом выводе - в 4-й строке, когда ID = 1 возвращается к Var = A, я хочу, чтобы индекс сбрасывался до 1, а не как 3., т.е. я хотел бы, чтобы индекс был сброшен каждый раз, когда Var изменяется для данного идентификатора.

для ref здесь был мой запрос:

SELECT *, DENSE_RANK() OVER (PARTITION BY ID, VAR ORDER BY VARSEQ) FROM MYTABLE

Ответы [ 2 ]

1 голос
/ 18 марта 2020

Это пример проблемы пробелов и островков. Однако SQL таблицы представляют неупорядоченные наборы. Без столбца, в котором указан общий порядок, ваш вопрос не имеет смысла.

В этом случае разница номеров строк будет делать то, что вы хотите. Но вам нужен общий столбец заказа:

select t.*,
       row_number() over (partition by id, var, seqnum - seqnum2 order by <ordering col>) as newseq
from (select t.*,
             row_number() over (partition by id order by <ordering col>) as seqnum,
             row_number() over (partition by id, var order by <ordering col>) as seqnum2
      from t
     ) t
0 голосов
/ 18 марта 2020

Пока нет ответа, но только для лучшего форматирования.

WITH TAB (ID, Var, Varseq) AS 
(
VALUES
  (1, 'A', 1)
, (1, 'A', 2)
, (1, 'A', 3)
, (1, 'B', 1)
, (2, 'A', 1)
, (2, 'C', 1)
)
SELECT *
FROM TAB
ORDER BY ID, <order keys>;

Вы указали Var, Varseq как <order keys> в запросе выше. Результат:

|ID         |VAR|VARSEQ     |
|-----------|---|-----------|
|1          |A  |1          |
|1          |A  |2          |
|1          |A  |3          |
|1          |B  |1          |
|2          |A  |1          |
|2          |C  |1          |

Но вам нужно следующее в соответствии с вашим вопросом:

|ID         |VAR|VARSEQ     |
|-----------|---|-----------|
|1          |A  |1          |
|1          |A  |2          |
|1          |B  |1          |
|1          |A  |3          |
|2          |A  |1          |
|2          |C  |1          |

Поэтому, пожалуйста, отредактируйте ваш вопрос, чтобы указать такое предложение <order keys>, чтобы получить результат вам нужен. И, пожалуйста, запустите ваш запрос для получения такого заказа в вашей системе, прежде чем публиковать здесь ...

...