You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

T-SQL按User升序排序含空值的分区任务数据问题

解决按User升序排序且保留同任务关联记录的问题

先把你的原始数据整理成清晰的表格:

tasknameskillnameuserPartition
taskAAAAskill1111user31
skill22221
taskBBBBskill1111user22
taskCCCCskill3333user13
taskDDDDskill1111user44
skill22224

你的核心需求是:按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;

代码解释

  1. CTE task_with_complete_user:用MAX(user) OVER (PARTITION BY taskname)把同一任务下的user值统一补全,解决原始数据中同任务后续行user为空的问题,让排序逻辑能正常生效。
  2. 还原显示格式:用ROW_NUMBER()给同一任务内的行编号,只在第一行显示taskname和user,其余行留空,和原始表格的样式保持一致。
  3. 排序逻辑:先按补全后的full_user升序,这样user1对应的taskCCCC会排在最前面,接着是user2的taskBBBB、user3的taskAAAA、user4的taskDDDD;同时同一任务的所有记录会因为taskname排序而绑定在一起,不会被拆分。

最终排序后的结果

执行上述代码后,你会得到如下符合需求的结果:

tasknameskillnameuserPartition
taskCCCCskill3333user13
taskBBBBskill1111user22
taskAAAAskill1111user31
skill22221
taskDDDDskill1111user44
skill22224

内容的提问来源于stack exchange,提问作者Eric Tee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:04:13