我有这样的员工工资表,包括他们的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
答案 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