2

我有這樣的員工工資表,他們的EmpID和他們的工資。將行分組以最小化偏差

EmpId | Wages 
    ================ 
    101 | 1280 
    102 | 1600 
    103 | 1400 
    104 | 1401 
    105 | 1430 
    106 | 1300 

我需要寫一個根據自己的工資,這樣,類似的工薪階層是羣體一起偏差內的組是最小的存儲過程SQL服務器,到組僱員可能。

沒有其他條件或規則提到。

輸出應該是這樣的

EmpId | Wages | Group 
    ======================= 
    101 | 1280 | 1 
    106 | 1300 | 1 
    103 | 1400 | 2 
    104 | 1401 | 2 
    105 | 1430 | 2 
    102 | 1600 | 3 

回答

2

您可以使用查詢類似如下:

SELECT EmpId, Wages, 
     DENSE_RANK() OVER (ORDER BY CAST(Wages - t.min_wage AS INT)/100) AS grp 
FROM mytable 
CROSS JOIN (SELECT MIN(Wages) AS min_wage FROM mytable) AS t 

查詢計算從最低工資每工資的距離,然後使用整數以作爲100,以便將記錄放置在切片中。因此,所有偏離最低工資的0 - 99之間的記錄都放置在第一個切片中。第二片包含記錄關閉的100 - 199從最低工資等

+0

所以,你基本上是縮小和比較。 但是,如果縮小後,縮減的工資將達到98和101.理想情況下,他們也應該在同一組。 –

+0

@CodeFearer是的,這是我的查詢的一個缺點。但是,您可能會遇到與所選其他方法相似的問題。 –

0

您可以+-30 deviation爲如下:

DECLARE @Tbl TABLE (EmpId INT, Wages INT) 
INSERT INTO @Tbl   
VALUES 
(99, 99), 
(100, 101), 
(101, 1280), 
(102, 1600), 
(103, 1400), 
(104, 1401), 
(105, 1430), 
(106, 1300) 

;WITH CTE AS (SELECT *, ROW_NUMBER() OVER (ORDER BY Wages) AS RowId FROM @Tbl) 

SELECT 
    A.EmpId , 
    A.Wages , 
    DENSE_RANK() OVER (ORDER BY MIN(B.RowId)) [Group] 
FROM 
    CTE A CROSS JOIN CTE B 
WHERE 
    ABS(B.Wages - A.Wages) BETWEEN 0 AND 30 -- Here +-30 
GROUP BY A.EmpId, A.Wages 
ORDER BY A.Wages 

結果:

EmpId  Wages  Group 
----------- ----------- -------------------- 
99   99   1 
100   101   1 
101   1280  2 
106   1300  2 
103   1400  3 
104   1401  3 
105   1430  3 
102   1600  4