如何对每个组的行进行排序(PostgreSQL)
有一个组号,每个组号有几个仪表号。 我需要根据状态值对查询结果进行排序。 如果组中状态列的值为“异常”,则属于该组的总行应像所需结果一样打印在上面。 我想到了联合,但我看不出正确的一个 在这件事上你能帮我吗 @DDL/DML如何对每个组的行进行排序(PostgreSQL),postgresql,Postgresql,有一个组号,每个组号有几个仪表号。 我需要根据状态值对查询结果进行排序。 如果组中状态列的值为“异常”,则属于该组的总行应像所需结果一样打印在上面。 我想到了联合,但我看不出正确的一个 在这件事上你能帮我吗 @DDL/DML CREATE TABLE test.sort_test ( group_number integer, inst_number integer, status1 character varying, status2 character var
CREATE TABLE test.sort_test
(
group_number integer,
inst_number integer,
status1 character varying,
status2 character varying
);
INSERT INTO test.sort_test VALUES(0,0,'NORMAL','NORMAL');
INSERT INTO test.sort_test VALUES(0,1,'NORMAL','NORMAL');
INSERT INTO test.sort_test VALUES(0,2,'NORMAL','NORMAL');
INSERT INTO test.sort_test VALUES(0,3,'NORMAL','NORMAL');
INSERT INTO test.sort_test VALUES(1,0,'ABNORMAL','NORMAL');
INSERT INTO test.sort_test VALUES(1,1,'NORMAL','NORMAL');
INSERT INTO test.sort_test VALUES(1,2,'NORMAL','NORMAL');
INSERT INTO test.sort_test VALUES(2,0,'NORMAL','ABNORMAL');
@原始查询
select *
from test.sort_test
order by group_number, inst_number
0 0 "NORMAL" "NORMAL"
0 1 "NORMAL" "NORMAL"
0 2 "NORMAL" "NORMAL"
0 3 "NORMAL" "NORMAL"
1 0 "ABNORMAL" "NORMAL"
1 1 "NORMAL" "NORMAL"
1 2 "NORMAL" "NORMAL"
2 0 "NORMAL" "ABNORMAL"
@期望结果
1 0 "ABNORMAL" "NORMAL"
1 1 "NORMAL" "NORMAL"
1 2 "NORMAL" "NORMAL"
2 0 "NORMAL" "ABNORMAL"
0 0 "NORMAL" "NORMAL"
0 1 "NORMAL" "NORMAL"
0 2 "NORMAL" "NORMAL"
0 3 "NORMAL" "NORMAL"
如果组的任何行中的条件为真,则bool\u或
为真
如果条件在组中的任何一行中为真,
bool\u或
为真。按组编号desc、inst\u编号排序
?…否。当只有一个组的状态为“异常”时,应首先在上面打印。请更新post,将插入到test.sort_测试值中(0,4,“异常”)代码>并使用新数据更新样本当前样本数据正确。为什么你不这么认为?我想了解其余列的顺序,否则我只会告诉按状态排序
按组编号说明、指令编号排序
?…否。当只有一个组的状态为“异常”时,应首先在上面打印。请更新post,将插入到test.sort_测试值中(0,4,“异常”)代码>并使用新数据更新样本当前样本数据正确。为什么你不这么认为?我想了解其余列的顺序,否则我只会告诉按状态排序
太棒了!如果有几个状态,如status1和status2,该怎么办?我几乎了解您的解决方案,但不确定bool_或多种因素的用法。你能帮我更多吗?我相应地编辑了我的问题。@Sigularity:两种状态的权重相同,或者status1是first?相同的权重。如果任何状态值为“异常”,则其组应在上面。谢谢。@Sigularity:只需将每个状态添加到bool\u或条件中即可。太棒了!如果有几个状态,如status1和status2,该怎么办?我几乎了解您的解决方案,但不确定bool_或多种因素的用法。你能帮我更多吗?我相应地编辑了我的问题。@Sigularity:两种状态的权重相同,或者status1是first?相同的权重。如果任何状态值为“异常”,则其组应在上面。谢谢。@Sigularity:只需将每个状态添加到bool\u或条件中即可。
select group_number, inst_number, status1, status2
from
sort_test
inner join (
select group_number, bool_or('ABNORMAL' in (status1, status2)) as abnormal
from sort_test
group by group_number
) s using (group_number)
order by not abnormal, group_number, inst_number
;
group_number | inst_number | status1 | status2
--------------+-------------+----------+----------
1 | 0 | ABNORMAL | NORMAL
1 | 1 | NORMAL | NORMAL
1 | 2 | NORMAL | NORMAL
2 | 0 | NORMAL | ABNORMAL
0 | 0 | NORMAL | NORMAL
0 | 1 | NORMAL | NORMAL
0 | 2 | NORMAL | NORMAL
0 | 3 | NORMAL | NORMAL