如何对每个组的行进行排序(PostgreSQL)

如何对每个组的行进行排序(PostgreSQL),postgresql,Postgresql,有一个组号,每个组号有几个仪表号。 我需要根据状态值对查询结果进行排序。 如果组中状态列的值为“异常”,则属于该组的总行应像所需结果一样打印在上面。 我想到了联合,但我看不出正确的一个 在这件事上你能帮我吗 @DDL/DML CREATE TABLE test.sort_test ( group_number integer, inst_number integer, status1 character varying, status2 character var

有一个组号,每个组号有几个仪表号。 我需要根据状态值对查询结果进行排序。 如果组中状态列的值为“异常”,则属于该组的总行应像所需结果一样打印在上面。 我想到了联合,但我看不出正确的一个

在这件事上你能帮我吗

@DDL/DML

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