SQL 按时间间隔分组数据
SQL Grouping Data by Intervals
全部,
我正在寻找一种可缩放的方法,将这些员工 ID "bucket" 放入 "Left" 或 "Right" 维度中以用于报告目的。我需要将前 3 个不同的 ID 分组到左侧组,接下来的 3 个分组到右侧组,依此类推,接下来的 3 个分组到左侧组,依此类推。实际数据集包含数百个ID。
谢谢
原始数据:
Rank Faculty_Staff_ID
----------------------------
1 zcrm_315216
1 zcrm_315216
1 zcrm_315216
2 zcrm_315217
2 zcrm_315217
2 zcrm_315217
3 zcrm_315218
4 zcrm_315219
4 zcrm_315219
4 zcrm_315219
5 zcrm_319795
5 zcrm_319795
6 zcrm_315220
6 zcrm_315220
7 zcrm_315221
8 zcrm_315222
9 zcrm_315223
9 zcrm_315223
9 zcrm_315223
期望的输出:
L_or_R Rank Faculty_Staff_ID
----------------------------------
L 1 zcrm_315216
L 1 zcrm_315216
L 1 zcrm_315216
L 2 zcrm_315217
L 2 zcrm_315217
L 2 zcrm_315217
L 3 zcrm_315218
R 4 zcrm_315219
R 4 zcrm_315219
R 4 zcrm_315219
R 5 zcrm_319795
R 5 zcrm_319795
R 6 zcrm_315220
R 6 zcrm_315220
L 7 zcrm_315221
L 8 zcrm_315222
L 9 zcrm_315223
L 9 zcrm_315223
L 9 zcrm_315223
你可以关注
在 Rank
列编号上创建 RowNumber
。
让 Rank
在子查询上使用 CASE WHEN
按 3
分组。
- 在主查询
grp % 2 = 0
上使用 CASE WHEN
拆分 L
和 R
您可以试试这个查询。
SELECT t.*,(CASE WHEN grp % 2 = 0 then 'R' ELSE 'L' END) 'L_or_R'
FROM T t
INNER JOIN (
SELECT rnk,SUM(CASE WHEN (rn -1)% 3 = 0 THEN 1 ELSE 0 END) OVER(ORDER BY rn) grp
FROM (
SELECT rnk,ROW_NUMBER() OVER(ORDER BY rnk) rn
FROM
(
SELECT DISTINCT Rank rnk
FROM T
)t
) t
) t1 on t.Rank = t1.rnk
sqlfiddle:https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=615c015a856b57511a2dcf0323f0d4a5
要解决这个问题,DENSE_RANK
函数和一点算术就足够了。
CREATE TABLE T(
Rank INT,
Faculty_Staff_ID VARCHAR(50)
);
INSERT INTO T VALUES
(1,'zcrm_315216'),
(1,'zcrm_315216'),
(1,'zcrm_315216'),
(2,'zcrm_315217'),
(2,'zcrm_315217'),
(2,'zcrm_315217'),
(2,'zcrm_315217'),
(2,'zcrm_315217'),
(2,'zcrm_315217'),
(2,'zcrm_315217'),
(2,'zcrm_315217'),
(2,'zcrm_315217'),
(2,'zcrm_315217'),
(2,'zcrm_315217'),
(2,'zcrm_315217'),
(2,'zcrm_315217'),
(2,'zcrm_315217'),
(2,'zcrm_315217'),
(2,'zcrm_315217'),
(2,'zcrm_315217'),
(2,'zcrm_315217'),
(3,'zcrm_315218'),
(4,'zcrm_315219'),
(4,'zcrm_315219'),
(4,'zcrm_315219'),
(5,'zcrm_319795'),
(5,'zcrm_319795'),
(6,'zcrm_315220'),
(6,'zcrm_315220'),
(7,'zcrm_315221'),
(8,'zcrm_315222'),
(10,'zcrm_315223'),
(21,'zcrm_315223'),
(23,'zcrm_315223'),
(25,'zcrm_315223'),
(25,'zcrm_315223'),
(27,'zcrm_315223');
SELECT *,
IIF(((DENSE_RANK() OVER (ORDER BY Rank) - 1) / 3) % 2 = 0, 'L', 'R') L_or_R
FROM T
ORDER BY Rank;
欢迎here查看
全部,
我正在寻找一种可缩放的方法,将这些员工 ID "bucket" 放入 "Left" 或 "Right" 维度中以用于报告目的。我需要将前 3 个不同的 ID 分组到左侧组,接下来的 3 个分组到右侧组,依此类推,接下来的 3 个分组到左侧组,依此类推。实际数据集包含数百个ID。
谢谢
原始数据:
Rank Faculty_Staff_ID
----------------------------
1 zcrm_315216
1 zcrm_315216
1 zcrm_315216
2 zcrm_315217
2 zcrm_315217
2 zcrm_315217
3 zcrm_315218
4 zcrm_315219
4 zcrm_315219
4 zcrm_315219
5 zcrm_319795
5 zcrm_319795
6 zcrm_315220
6 zcrm_315220
7 zcrm_315221
8 zcrm_315222
9 zcrm_315223
9 zcrm_315223
9 zcrm_315223
期望的输出:
L_or_R Rank Faculty_Staff_ID
----------------------------------
L 1 zcrm_315216
L 1 zcrm_315216
L 1 zcrm_315216
L 2 zcrm_315217
L 2 zcrm_315217
L 2 zcrm_315217
L 3 zcrm_315218
R 4 zcrm_315219
R 4 zcrm_315219
R 4 zcrm_315219
R 5 zcrm_319795
R 5 zcrm_319795
R 6 zcrm_315220
R 6 zcrm_315220
L 7 zcrm_315221
L 8 zcrm_315222
L 9 zcrm_315223
L 9 zcrm_315223
L 9 zcrm_315223
你可以关注
在
Rank
列编号上创建RowNumber
。让
Rank
在子查询上使用CASE WHEN
按3
分组。- 在主查询
grp % 2 = 0
上使用CASE WHEN
拆分L
和R
您可以试试这个查询。
SELECT t.*,(CASE WHEN grp % 2 = 0 then 'R' ELSE 'L' END) 'L_or_R'
FROM T t
INNER JOIN (
SELECT rnk,SUM(CASE WHEN (rn -1)% 3 = 0 THEN 1 ELSE 0 END) OVER(ORDER BY rn) grp
FROM (
SELECT rnk,ROW_NUMBER() OVER(ORDER BY rnk) rn
FROM
(
SELECT DISTINCT Rank rnk
FROM T
)t
) t
) t1 on t.Rank = t1.rnk
sqlfiddle:https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=615c015a856b57511a2dcf0323f0d4a5
要解决这个问题,DENSE_RANK
函数和一点算术就足够了。
CREATE TABLE T(
Rank INT,
Faculty_Staff_ID VARCHAR(50)
);
INSERT INTO T VALUES
(1,'zcrm_315216'),
(1,'zcrm_315216'),
(1,'zcrm_315216'),
(2,'zcrm_315217'),
(2,'zcrm_315217'),
(2,'zcrm_315217'),
(2,'zcrm_315217'),
(2,'zcrm_315217'),
(2,'zcrm_315217'),
(2,'zcrm_315217'),
(2,'zcrm_315217'),
(2,'zcrm_315217'),
(2,'zcrm_315217'),
(2,'zcrm_315217'),
(2,'zcrm_315217'),
(2,'zcrm_315217'),
(2,'zcrm_315217'),
(2,'zcrm_315217'),
(2,'zcrm_315217'),
(2,'zcrm_315217'),
(2,'zcrm_315217'),
(3,'zcrm_315218'),
(4,'zcrm_315219'),
(4,'zcrm_315219'),
(4,'zcrm_315219'),
(5,'zcrm_319795'),
(5,'zcrm_319795'),
(6,'zcrm_315220'),
(6,'zcrm_315220'),
(7,'zcrm_315221'),
(8,'zcrm_315222'),
(10,'zcrm_315223'),
(21,'zcrm_315223'),
(23,'zcrm_315223'),
(25,'zcrm_315223'),
(25,'zcrm_315223'),
(27,'zcrm_315223');
SELECT *,
IIF(((DENSE_RANK() OVER (ORDER BY Rank) - 1) / 3) % 2 = 0, 'L', 'R') L_or_R
FROM T
ORDER BY Rank;
欢迎here查看