Плотный ранг неправильно генерирует строки - PullRequest
2 голосов
/ 22 апреля 2020

У меня есть таблица A:

Create table A(
    Name varchar(10),
    Number integer,
    Exc integer,
    D1 date
)

Я вставил 11 строк.

Sel * from A;
+ -----+--------+-----+------------+
| NAME | NUMBER | EXC | D1         |
+ -----+--------+-----+------------+
| a    |      1 |   1 | 2020-02-03 |
| a    |      1 |   2 | 2020-02-03 |
| a    |      1 |   3 | 2020-02-03 |
| a    |      1 |   4 | 2020-02-03 |
| a    |      1 |   1 | 2020-02-04 |
| a    |      1 |   2 | 2020-02-04 |
| a    |      1 |   3 | 2020-02-04 |
| a    |      1 |   1 | 2020-02-05 |
| a    |      1 |   2 | 2020-02-05 |
| a    |      1 |   3 | 2020-02-05 |
| a    |      1 |   4 | 2020-02-05 |
+ -----+--------+-----+------------+

Теперь, когда я применяю плотный ранг, как показано ниже:

sel vt.*,dense_rank() OVER(PARTITION BY Name,Number,EXC ORDER BY D1 ) AS rn
from vt;

Выход:

+ -----+--------+-----+------------+----+
| NAME | NUMBER | EXC | D1         | RN |
+ -----+--------+-----+------------+----+
| a    |      1 |   1 | 2020-02-03 |  1 |
| a    |      1 |   2 | 2020-02-03 |  1 |
| a    |      1 |   3 | 2020-02-03 |  1 |
| a    |      1 |   4 | 2020-02-03 |  1 |
| a    |      1 |   1 | 2020-02-04 |  2 |
| a    |      1 |   2 | 2020-02-04 |  2 |
| a    |      1 |   3 | 2020-02-04 |  2 |
| a    |      1 |   1 | 2020-02-05 |  3 |
| a    |      1 |   2 | 2020-02-05 |  3 |
| a    |      1 |   3 | 2020-02-05 |  3 |
| a    |      1 |   4 | 2020-02-05 |  2 |
+ -----+--------+-----+------------+----+

Ожидаемый:

+ -----+--------+-----+------------+----+
| NAME | NUMBER | EXC | D1         | RN |
+ -----+--------+-----+------------+----+
| a    |      1 |   1 | 2020-02-03 |  1 |
| a    |      1 |   2 | 2020-02-03 |  1 |
| a    |      1 |   3 | 2020-02-03 |  1 |
| a    |      1 |   4 | 2020-02-03 |  1 |
| a    |      1 |   1 | 2020-02-04 |  2 |
| a    |      1 |   2 | 2020-02-04 |  2 |
| a    |      1 |   3 | 2020-02-04 |  2 |
| a    |      1 |   1 | 2020-02-05 |  3 |
| a    |      1 |   2 | 2020-02-05 |  3 |
| a    |      1 |   3 | 2020-02-05 |  3 |
| a    |      1 |   4 | 2020-02-05 |  3 | <-- Difference here
+ -----+--------+-----+------------+----+

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Удаление столбца EXC из PARTITION даст ожидаемые результаты:

DENSE_RANK() OVER(PARTITION BY Name, Number ORDER BY D1)

Демонстрация на DB Fiddle :

name | number | exc | d1         | rn
:--- | -----: | --: | :--------- | :-
a    |      1 |   1 | 2020-02-03 | 1 
a    |      1 |   2 | 2020-02-03 | 1 
a    |      1 |   3 | 2020-02-03 | 1 
a    |      1 |   4 | 2020-02-03 | 1 
a    |      1 |   1 | 2020-02-04 | 2 
a    |      1 |   2 | 2020-02-04 | 2 
a    |      1 |   3 | 2020-02-04 | 2 
a    |      1 |   1 | 2020-02-05 | 3 
a    |      1 |   2 | 2020-02-05 | 3 
a    |      1 |   3 | 2020-02-05 | 3 
a    |      1 |   4 | 2020-02-05 | 3 
0 голосов
/ 22 апреля 2020

Вы просто хотите ранжировать все строки по дате? Затем удалите предложение раздела, чтобы ранжирование производилось не внутри групп.

select name, number, exc, d1, dense_rank() over (order by d1) as rn
from vt
order by d1, name, number, exc;
...