如何对 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
- 特殊类型 R 应始终在每个键组中排在第一位。
- S 可以在 R 和 B 元素之后,但它应该具有相同的 group_id
- 如果S和R的specialtype有相同的group_id,它应该在这个R Specialtype
之后
结果应如下所示
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
我在 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
- 特殊类型 R 应始终在每个键组中排在第一位。
- S 可以在 R 和 B 元素之后,但它应该具有相同的 group_id
- 如果S和R的specialtype有相同的group_id,它应该在这个R Specialtype 之后
结果应如下所示
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