如何对 table 中的数据进行四列排序?

How can I sort the data in a table over four columns?

我在 db2 中有一个要排序的 table。 table 有四列。 数据如下:

KEY Type    GROUP_ID    SpecialType
2   T02     700         S
2   T01     500         R
1   T02     300         B
2   T02     600         S
1   T02     400         S
2   T02     700         B
1   T01     400         R
1   T02     300         S
2   T02     600         B

排序顺序有以下规则:

结果应如下所示

KEY Type    GROUP_ID    SpecialType
1   T01     400         R
1   T02     400         S
1   T02     300         B
1   T02     300         S
2   T01     500         R
2   T02     600         B
2   T02     600         S
2   T02     700         B
2   T02     700         S

我试过这个 ORDER BY,但它不起作用:

select * from myTable
ORDER BY KEY, GROUP_ID, CASE WHEN SPECIALTYPE = 'R' THEN 1
                             WHEN SPECIALTYPE='B' THEN 2
                             ELSE 3 END

有什么想法吗??

你快到了。

尝试select * from myTable ORDER BY KEY, CASE WHEN SPECIALTYPE = 'R' THEN 1 ELSE 2 END, GROUP_ID

您需要创建 table 来定义这样的排序首选项

Preferance
---------------------------------------------
SpecialType         OrderNo
---------------------------------------------
R                  1
B                  2
S                  3

现在将此 table 与来自此 table 的主要 table 和 select 订单列合并,并使用 orderNo 列对您的记录进行排序,如下所示

select T.*, P.orderNo  
from myTable  T
  INNER JOIN Preferance P ON T.Preferance = P.Preferance
ORDER BY T.KEY, T.GROUP_ID, P.orderNo 

这应该 return 按您提供的顺序排列的列表。它在排序中包含一个分析函数,该函数计算每个 GroupId 中包含 'R' 的次数,以便首先列出这些 groupId。

SELECT
    t.KeyId,
    t.TypeName,
    t.GroupId,
    t.SpecialType
FROM @Table t
ORDER BY 
    KeyId,
    CASE WHEN SpecialType = 'R' THEN 1 ELSE 2 END,
    COUNT(CASE WHEN t.SpecialType = 'R' THEN SpecialType END) OVER (PARTITION BY t.GroupId) DESC,
    GroupId,
    SpecialType