2017-04-19 56 views
0

我試圖排名使用以下查詢的記錄:分區通過在兩列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 
+0

我認爲樣本數據和期望的結果會幫助你解釋你想要的。 –

+0

作爲ddl + dml的樣本數據和期望的結果將有助於... –

+0

,因爲您按順序排列結果,它將擾亂「分區」部分,嘗試「按TW.EMPL_ID排序,TW.HR_DEPT_ID,TW.Transfer_Startdate ,TW.RN'或刪除'Order by' – LONG

回答

0
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' 

UPDATE

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 
0

擴大樣本數據:

create table t (
    aon_empl_id varchar(16) 
    , hr_dept_id varchar(16) 
    , Transfer_Startdate date 
    , Effective_bdate date 
); 
insert into t values 
('0100690','69895','01/01/2017','2017-01-01') 
,('0100690','69895','01/01/2017','2017-01-03') 
,('0100690','69895','01/01/2017','2017-01-04') 
,('0200700','69895','01/01/2016','2016-01-01') 
,('0200700','69895','01/01/2016','2016-01-03') 
,('0200700','69896','01/01/2017','2017-01-04') 
,('0200700','69896','01/01/2017','2017-01-04'); 

使用top with ties

select top 1 with ties 
    aon_empl_id 
    , hr_dept_id 
    , Transfer_Startdate = convert(char(10),Transfer_Startdate,120) 
    , Effective_bdate = convert(char(10),Effective_bdate,120) 
from t 
order by row_number() over (
     partition by aon_empl_id, hr_dept_id, Transfer_Startdate 
     order by Effective_bdate 
    ) 

rextester演示:http://rextester.com/KOIZ42069

回報:

+-------------+------------+--------------------+-----------------+ 
| aon_empl_id | hr_dept_id | Transfer_Startdate | Effective_bdate | 
+-------------+------------+--------------------+-----------------+ 
|  0100690 |  69895 | 2017-01-01   | 2017-01-01  | 
|  0200700 |  69895 | 2016-01-01   | 2016-01-01  | 
|  0200700 |  69896 | 2017-01-01   | 2017-01-04  | 
+-------------+------------+--------------------+-----------------+ 
使用 common table expressionrow_number()

備選:

;with cte as (
select 
    rn = row_number() over (
     partition by aon_empl_id, hr_dept_id, Transfer_Startdate 
     order by Effective_bdate 
    ) 
    , aon_empl_id 
    , hr_dept_id 
    , Transfer_Startdate = convert(char(10),Transfer_Startdate,120) 
    , Effective_bdate = convert(char(10),Effective_bdate,120) 
from t tw 
) 

select * 
from cte 
where rn = 1 

回報:

+----+-------------+------------+--------------------+-----------------+ 
| rn | aon_empl_id | hr_dept_id | Transfer_Startdate | Effective_bdate | 
+----+-------------+------------+--------------------+-----------------+ 
| 1 |  0100690 |  69895 | 2017-01-01   | 2017-01-01  | 
| 1 |  0200700 |  69895 | 2016-01-01   | 2016-01-01  | 
| 1 |  0200700 |  69896 | 2017-01-01   | 2017-01-04  | 
+----+-------------+------------+--------------------+-----------------+ 
+0

這非常適用於我作爲一個樣本一個員工記錄,在員工人數將重複秩例如用於上述組行的都將是1,但在未來的員工將是2。我想有RN = 1對所有員工的記錄,其中empl_id,hr_dept_id, transfer_startdate是一樣的。 – Sharktooth

+0

@Sharktooth時,你希望它不會是'1'沒有解釋。 「分區」中的哪個部分,例如'(分區由aon_empl_id爲了通過aon_empl_id,hr_dept_id,Transfer_Startdate)' – SqlZim

+0

分區通過將具有以下列:aon_empl_id,hr_dept_id,Transfer_Startdate如果這些列具有用於多行鮮明的唯一值,則RN應該遞增1,否則它應該保持1 – Sharktooth

0

這段代碼似乎工作:

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子句。