T-SQL按User升序排序含空值的分区任务数据问题
解决按User升序排序且保留同任务关联记录的问题
先把你的原始数据整理成清晰的表格:
| taskname | skillname | user | Partition |
|---|---|---|---|
| taskAAAA | skill1111 | user3 | 1 |
| skill2222 | 1 | ||
| taskBBBB | skill1111 | user2 | 2 |
| taskCCCC | skill3333 | user1 | 3 |
| taskDDDD | skill1111 | user4 | 4 |
| skill2222 | 4 |
你的核心需求是:按user列升序排序,同时保证同一任务的所有关联记录始终排在一起,还要保留原始的显示格式(同一任务的后续行taskname和user为空)。
解决方案(以SQL为例)
我们可以通过窗口函数先补全同一任务的user值,再排序,最后还原显示格式:
WITH task_with_complete_user AS ( -- 第一步:补全同一task下的user值(原始数据中同任务后续行user为空,但实际和第一行一致) SELECT taskname, skillname, MAX(user) OVER (PARTITION BY taskname) AS full_user, Partition FROM your_table_name ) SELECT -- 同一task只在第一行显示taskname,其余行留空 CASE WHEN ROW_NUMBER() OVER (PARTITION BY taskname ORDER BY skillname) = 1 THEN taskname ELSE '' END AS taskname, skillname, -- 同一task只在第一行显示user,其余行留空 CASE WHEN ROW_NUMBER() OVER (PARTITION BY taskname ORDER BY skillname) = 1 THEN full_user ELSE '' END AS user, Partition FROM task_with_complete_user -- 先按user升序,再按taskname确保同任务记录绑定,最后按skillname排序同任务内技能 ORDER BY full_user, taskname, skillname;
代码解释
- CTE
task_with_complete_user:用MAX(user) OVER (PARTITION BY taskname)把同一任务下的user值统一补全,解决原始数据中同任务后续行user为空的问题,让排序逻辑能正常生效。 - 还原显示格式:用
ROW_NUMBER()给同一任务内的行编号,只在第一行显示taskname和user,其余行留空,和原始表格的样式保持一致。 - 排序逻辑:先按补全后的
full_user升序,这样user1对应的taskCCCC会排在最前面,接着是user2的taskBBBB、user3的taskAAAA、user4的taskDDDD;同时同一任务的所有记录会因为taskname排序而绑定在一起,不会被拆分。
最终排序后的结果
执行上述代码后,你会得到如下符合需求的结果:
| taskname | skillname | user | Partition |
|---|---|---|---|
| taskCCCC | skill3333 | user1 | 3 |
| taskBBBB | skill1111 | user2 | 2 |
| taskAAAA | skill1111 | user3 | 1 |
| skill2222 | 1 | ||
| taskDDDD | skill1111 | user4 | 4 |
| skill2222 | 4 |
内容的提问来源于stack exchange,提问作者Eric Tee
相关产品推荐
相关产品推荐

