Разделить по двум столбцам в функции Row_Number

Я пытаюсь ранжировать записи, используя следующий запрос:

SELECT 
ROW_NUMBER() over (partition by 
TW.EMPL_ID,TW.HR_DEPT_ID,TW.Transfer_Startdate 
order by TW.EMPL_ID,TW.Effective_Bdate) RN,
TW.EMPL_ID,TW.HR_DEPT_ID,TW.Transfer_Startdate,Effective_BDate from 
TT_EMPLOYEE_WORKDAY TW
where TW.HR_DOMAIN_CODE = 'SGP'

Однако результирующий вычисляемый столбец Row_Number отображает раздел только для первого столбца. В идеале я ожидал, что для Row_Number будет одинаковое значение, где разделение по данным столбца идентично.

Любая подсказка, где я могу ошибаться?

USING RANK или DENSE RANK не вариант, так как я хочу идентифицировать все такие строки для нескольких сотрудников, где EMPL_ID, HR_DEPT_ID и Transfer_StartDate одинаковы (RN = 1)

Sample data:
RN  AON_EMPL_ID   HR_DEPT_ID    Transfer_Startdate  Effective_BDate
1   0100690       69895             01/01/2017       2017-01-01
2   0100690       69895             01/01/2017       2017-01-03
3   0100690       69895             01/01/2017       2017-01-04

person Whitewolf    schedule 19.04.2017    source источник
comment
Я думаю, что примеры данных и желаемые результаты помогут вам объяснить, чего вы хотите.   -  person Gordon Linoff    schedule 19.04.2017
comment
Примеры данных в виде ddl+dml и желаемый результат помогут...   -  person Zohar Peled    schedule 19.04.2017
comment
потому что вы Order by результат, он испортит Partition часть, попробуйте Order by TW.EMPL_ID,TW.HR_DEPT_ID,TW.Transfer_Startdate,TW.RN или удалите Order by   -  person LONG    schedule 19.04.2017
comment
Даже без порядка использования в последней строке номер RN меняется. Он должен быть равен 1, так как первые три столбца, используемые в Partition By, содержат одинаковые данные.   -  person Whitewolf    schedule 19.04.2017
comment
где TW.EMPL_ID, вы могли ошибиться с TW.AON_EMPL_ID?   -  person LONG    schedule 19.04.2017
comment
@LONG Пожалуйста, не обращайте на это внимания, я изменил запрос, чтобы не публиковать конфиденциальную информацию. Запрос синтаксически правильный.   -  person Whitewolf    schedule 19.04.2017
comment
@GordonLinoff Добавлены образцы данных. Желаемый результат: RN должен быть равен 1 для всех трех строк.   -  person Whitewolf    schedule 19.04.2017
comment
@Sharktooth, вы говорите о RANK или DENSE_RANK, а не ROW_NUMBER, замените более поздний на любой из предыдущих, и зависит от того, как вы хотите показать данные 2-го места   -  person LONG    schedule 19.04.2017
comment
@LONG Rank не будет работать для более чем одного сотрудника, как предлагает первое предложенное ниже решение.   -  person Whitewolf    schedule 19.04.2017
comment
@Sharktooth Проверьте мое обновление, я думаю, вам нужно только order by Effective Date из результата, который не должен вносить никакого вклада в функцию   -  person LONG    schedule 19.04.2017


Ответы (3)


SELECT 
RANK() over (partition by   --or DENSE_RANK()
TW.EMPL_ID,TW.HR_DEPT_ID,TW.Transfer_Startdate 
order by TW.EMPL_ID,TW.Effective_Bdate) RN,
TW.EMPL_ID,TW.HR_DEPT_ID,TW.Transfer_Startdate,Effective_BDate from 
TT_EMPLOYEE_WORKDAY TW
where TW.HR_DOMAIN_CODE = 'SGP'

ОБНОВЛЕНИЕ

SELECT 
RANK() over (partition by   --or DENSE_RANK()
TW.EMPL_ID,TW.HR_DEPT_ID,TW.Transfer_Startdate 
order by TW.EMPL_ID) RN,
TW.EMPL_ID,TW.HR_DEPT_ID,TW.Transfer_Startdate,Effective_BDate from 
TT_EMPLOYEE_WORKDAY TW
where TW.HR_DOMAIN_CODE = 'SGP'
Order by RN,TW.Effective_Bdate
person LONG    schedule 19.04.2017

Этот бит кода работает:

SELECT 
dense_rank() over (partition by AON_EMPL_ID 
order by AON_EMPL_ID,HR_DEPT_ID,Transfer_StartDate) RN,
TW.AON_EMPL_ID,TW.HR_DEPT_ID,TW.Transfer_Startdate,Effective_BDate from 
TT_AON_EMPLOYEE_WORKDAY TW
where TW.HR_DOMAIN_CODE = 'SGP'

По-видимому, мне просто нужно разбить по AON_EMPL_ID, а все остальное должно идти в предложение Order By.

person Whitewolf    schedule 19.04.2017

person    schedule
comment
Это хорошо работает для одного сотрудника, которого я использовал в качестве образца записи, для ряда сотрудников он будет повторять ранг, например, для приведенного выше набора строк все будет 1, но для следующего сотрудника это будет 2. Я хочу иметь RN = 1 для всех записей сотрудников, где empl_id, hr_dept_id, transfer_startdate одинаковы. - person Whitewolf; 19.04.2017
comment
@Sharktooth Вы не объяснили, когда хотите, чтобы это не было 1. Какая часть идет в partition, например. (partition by aon_empl_id order by aon_empl_id, hr_dept_id, Transfer_Startdate) - person SqlZim; 19.04.2017
comment
section by будет иметь следующие столбцы: aon_empl_id, hr_dept_id, Transfer_Startdate, если эти столбцы имеют отличное уникальное значение для более чем одной строки, тогда RN должен увеличиваться на 1, иначе он должен оставаться 1. - person Whitewolf; 19.04.2017
comment
@Sharktooth Похоже на то, что ты уже сделал. Но я сделал еще один удар и обновил свой ответ. - person SqlZim; 19.04.2017