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