Cly*_*yde 1 sql t-sql sql-server pivot sql-server-2005
假设我有这些数据:
Employee Task IsCurrent
-------- ---- ---------
Jeff 1 Yes
Jeff 2 No
Jane 1 No
Jane 2 Yes
Jane 3 No
Jane 4 No
Jake 1 Yes
Run Code Online (Sandbox Code Playgroud)
员工有一些任务,其中一个是最新的.任务编号表示一个排序 - 他们按顺序执行任务,当他们完成最后一个任务时循环回到开头.我想查询以查看接下来的三个任务.我想要这个结果集:
Employee CurrentTask NextTask NextTask2
-------- ----------- -------- ---------
Jeff 1 2 1
Jane 2 3 4
Jake 1 1 1
Run Code Online (Sandbox Code Playgroud)
这可能吗?我正在使用SQL 2005
更新:对不起,我没有说清楚任务编号不一定是后续的 - 即Mike可能实际上有任务10,23和223.所以我不能只是加入寻找下一个顺序任务编号.
使用:
WITH summary AS (
SELECT t.employee,
t.task,
t.iscurrent,
ROW_NUMBER() OVER (PARTITION BY t.employee
ORDER BY t.task) AS rank
FROM TABLE t)
SELECT a.employee,
a.task AS current_task,
COALESCE(b.task, y.min_task) AS next_task,
COALESCE(c.task, y.min_task) AS next_task2
FROM summary a
JOIN (SELECT x.employee,
MIN(x.task) AS min_task
FROM TABLE x
GROUP BY x.employee) y ON y.employee = a.employee
LEFT JOIN summary b ON b.employee = a.employee
AND b.rank = a.rank + 1
LEFT JOIN summary c ON c.employee = a.employee
AND c.rank = a.rank + 2
WHERE a.iscurrent = 'yes'
Run Code Online (Sandbox Code Playgroud)
就像我之前说过的,如果SQL Server支持LEAD/LAG功能会更容易......