Row_Number Sybase SQL Anywhere изменить на несколько условий - PullRequest
2 голосов
/ 22 апреля 2020

У меня есть выборка, которая возвращает

EMP DOC  DATE
  1  78 01/01
  1  96 02/01
  1  96 02/01
  1 105 07/01
  2   4 04/01
  2   7 04/01
  3  45 07/01
  3  45 07/01
  3  67 09/01

И я хочу добавить номер строки (я буду использовать его в качестве основного идентификатора), но я хочу, чтобы он всегда менялся при изменении «EMP» и также не изменится, когда do c будет таким же, как предыдущий, например:

EMP DOC  DATE  ID
  1  78 01/01   1
  1  96 02/01   2
  1  96 02/01   2
  1 105 07/01   3
  2   4 04/01   1
  2   7 04/01   2
  3  45 07/01   1
  3  45 07/01   1
  3  67 09/01   2

на SQL сервере. Я могу использовать LAG для сравнения предыдущих DO C, но могу Кажется, я не могу найти путь к SYBASE SQL В любом месте, я использую ROW_NUMBER для разбиения по "EMP", но это не то, что мне нужно.

SELECT EMP, DOC, DATE, ROW_NUMBER() OVER (PARTITION BY EMP ORDER BY EMP, DOC, DATE) ID -- <== THIS WILL CHANGE THE ROW NUMBER ON SAME DOC ON SAME EMP, SO WOULD NOT WORK.

У кого-то есть направление для это?

Ответы [ 2 ]

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

Вы хотите dense_rank():

select
    emp,
    doc,
    date,
    dense_rank() over(partition by emp order by date) id
from mytable

Это число строк в группах, имеющих одинаковый emp, и увеличивается только при изменении date без пробелов.

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

если производительность не является проблемой в вашем случае, вы можете попробовать что-нибудь. как:

SELECT tx.EMP, tx.DOC, tx.DATE, y.ID
   FROM table_xxx tx
     join y on tx.EMP = y.EMP and tx.DOC = y.DOC
(SELECT EMP, DOC, ROW_NUMBER() OVER (PARTITION BY EMP ORDER BY DOC) ID
   FROM(SELECT EMP, DOC FROM table_xxx GROUP BY EMP, DOC)x)y
...