【发布时间】:2019-03-26 03:10:54
【问题描述】:
我有一个简单的SELECT ORDER BY 查询形式,它使用CASE 创建排序的ID。
我参考了基于https://gist.github.com/cpjolicoeur/3590737 的两种方法并使用了其中一种。
SELECT id FROM tasks t ORDER BY
CASE
WHEN t.type = 'TypeA' THEN 1
WHEN t.type = 'TypeB' THEN 2
WHEN t.type = 'TypeC' THEN 3
END,
CASE
WHEN t.state = 'Interrupted' THEN 4
WHEN t.state = 'Terminated' THEN 5
WHEN t.state = 'Completed' THEN 6
WHEN t.state = 'Killed' THEN 7
WHEN t.state = 'Warning' THEN 8
WHEN t.state = 'Starting' THEN 9
WHEN t.state = 'New' THEN 10
WHEN t.state = 'Running' THEN 11
END,
modified ASC;
以上查询基于以下条件对 id 进行排序:
- TypeA 与状态: 中断、终止、完成、终止、警告、启动、新建、运行
- TypeB 状态: 中断、终止、完成、终止、警告、启动、新建、运行
- TypeC 状态: 中断、终止、完成、终止、警告、启动、新建、运行
我现在需要根据以下排序条件修改此 sql:
- TypeA 的状态:Interrupted,Terminated,Completed,Killed
- TypeB 状态:Interrupted,Terminated,Completed,Killed
- TypeC 状态:中断、终止
- TypeA 状态:Warning,Starting,New,Running
- TypeB 状态:Warning,Starting,New,Running
- TypeC 状态:Completed,Killed,Warning,Starting,New,Running
请注意“状态”的顺序(如指定)对于“类型”在这里同样重要
我正在尝试修改上面的 sql 以使其符合新标准。作为一个 sql 专家,我正在寻找最有效的方法来重写这个 sql,它也可以在不久的将来适应排序标准的细微变化。
为了进一步阐明下面的共享示例:
样本数据
id | type | state
----+-------+-------------
1 | TypeC | Completed
2 | TypeA | Completed
3 | TypeA | Running
4 | TypeB | Completed
5 | TypeB | Running
6 | TypeC | Terminated
7 | TypeC | Unknown
8 | TypeA | Completed
9 | TypeB | Interrupted
10 | TypeB | Completed
11 | TypeB | Interrupted
12 | TypeC | Killed
13 | TypeC | Running
14 | TypeB | Warning
15 | TypeB | Running
16 | TypeB | Killed
预期数据
id | type | state
--- +-------+-------------
1 | TypeA | Completed
8 | TypeA | Completed
9 | TypeB | Interrupted
11 | TypeB | Interrupted
4 | TypeB | Completed
10 | TypeB | Completed
16 | TypeB | Killed
7 | TypeC | Unknown
6 | TypeC | Terminated
3 | TypeA | Running
14 | TypeB | Warning
5 | TypeB | Running
15 | TypeB | Running
1 | TypeC | Completed
12 | TypeC | Killed
13 | TypeC | Running
【问题讨论】:
标签: sql postgresql