Номер строки над разделами с уникальным, только если ConsecutiveNumber не уникален - PullRequest
0 голосов
/ 27 апреля 2020

Мне нужно иметь номер строки, который является уникальным для элементов с уникальным номером ConsecutiveNumber, однако, если ConsecutiveNumber встречается чаще, чем номер, номер строки должен быть одинаковым. Но я изо всех сил пытаюсь получить желаемый результат. Любая помощь будет высоко ценится.

Желаемый результат можно увидеть в таблице ниже targetOutput .

SELECT InvoiceNr,ConsecutiveNumber,ItemNr
       ,ROW_NUMBER() OVER (PARTITION BY ItemNr, InvoiceNr
                           ORDER BY  ItemNr, InvoiceNr) as currentOutput
FROM someTable
InvoiceNr   ConsecutiveNumber   ItemNr          currentOutput   targetOutput    
20001222    118                 h46f4-22-05     1               1
20001222    343                 h46f4-22-05     2               2
20001222    1243                h46f4-22-05     3               3
20001222    1991                h46f4-22-05     4               4
20001222    461                 n8-91           1               1
20001222    1495                n8-91           2               2
20001222    1495                n8-91           3               2
20001222    1495                n8-91           4               2
20001222    1844                pibb53-3-x      1               1
20001222    1844                pibb53-3-x      2               1
20001222    1844                pibb53-3-x      3               1

Ответы [ 2 ]

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

GMB Ударь меня к этому. Обратите внимание, разница между Rank и Dense_rank. Либо может работать в зависимости от того, что вы ищете. Я добавил дополнительную строку.

DECLARE @table TABLE 
(
  InvoiceNr         BIGINT,
  ConsecutiveNumber INT,
  ItemNr            VARCHAR(100)
)
INSERT @table VALUES
(20001222,118 ,'h46f4-22-05'),
(20001222,343 ,'h46f4-22-05'),
(20001222,1243,'h46f4-22-05'),
(20001222,1991,'h46f4-22-05'),
(20001222,461 ,'n8-91'),
(20001222,1495,'n8-91'),
(20001222,1495,'n8-91'),
(20001222,1495,'n8-91'),
(20001222,1844,'pibb53-3-x'),
(20001222,1844,'pibb53-3-x'),
(20001222,1844,'pibb53-3-x'),
(20001222,1845,'pibb53-3-x'); -- New record

SELECT 
  t.*,
  [RANK]       = RANK() OVER (PARTITION BY ItemNr, InvoiceNr
                                    ORDER BY  ConsecutiveNumber),
  [DENSE_RANK] = DENSE_RANK() OVER (PARTITION BY ItemNr, InvoiceNr
                                    ORDER BY  ConsecutiveNumber)
FROM @table AS t;

Результаты:

InvoiceNr    ConsecutiveNumber ItemNr          RANK   DENSE_RANK
------------ ----------------- --------------- ------ -------------
20001222     118               h46f4-22-05     1      1
20001222     343               h46f4-22-05     2      2
20001222     1243              h46f4-22-05     3      3
20001222     1991              h46f4-22-05     4      4
20001222     461               n8-91           1      1
20001222     1495              n8-91           2      2
20001222     1495              n8-91           2      2
20001222     1495              n8-91           2      2
20001222     1844              pibb53-3-x      1      1
20001222     1844              pibb53-3-x      1      1
20001222     1844              pibb53-3-x      1      1
20001222     1845              pibb53-3-x      4      2

Мелкие детали, но обратите внимание на разницу.

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

Вы хотите число, которое учитывает связи и которое увеличивается последовательно без пробелов.

Вы описываете dense_rank(). Я думаю, что вы хотите:

DENSE_RANK() OVER (
    PARTITION BY ItemNr, InvoiceNr 
    ORDER BY ConsecutiveNumber
) as currentOutput

Обратите внимание, что обычно бывает мало или нет смысла иметь одинаковые столбцы в предложениях PARTITION BY и ORDER BY. Первый определяет группы строк, а второй определяет порядок строк в группах. Использование ROW_NUMBER(), как вы это сделали, привело к появлению неопределенных индексов строк в группах (номера могли быть назначены в любом порядке внутри групп).

...