对行进行分组以最大限度地减少偏差

时间:2016-09-07 07:11:53

标签: sql-server database sql-server-2008 stored-procedures statistics

我有这样的员工工资表,包括他们的EmpID和他们的工资。

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

我需要在 SQL Server 中编写一个存储过程,根据他们的工资对员工进行分组,以便类似的受薪人员聚在一起并且内部的偏差该小组尽可能少。

没有提到其他条件或规则。

输出应该如下所示

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

2 个答案:

答案 0 :(得分: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最低工资等的记录。

答案 1 :(得分: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