如何在查询结果中更改具有特定值的行的位置

问题描述 投票:0回答:3

这就是我想要做的。

我有以下样本数据。

trxn_id event_id  timestamp
1         4        111
1        16        121
1         1        110

现在,我希望事件16在order by timestamp desc的结果中出现在4和1之间。意味着结果总是按时间顺序排序,除了event_id = 16行,就在event_id = 4的行之下,不管它的时间是多少。

我想首先选择event_id = 4结果,然后将其与选择其余event_id的结果联合起来,但它们不保持应用union的顺序。可以做些什么?谢谢。

编辑:我正在根据特定的trxn_id进行选择。一个trxn中可以有多个event_id=16。所有需要出现在event_id=4下面。

sql postgresql
3个回答
2
投票

我认为你可以为event_id预定义一个层次结构,首先按它排序,然后按TIMESTAMP DESC排序。

ORDER BY CASE event_id
        WHEN 4
            THEN 1
        WHEN 16
            THEN 2
        WHEN 1
            THEN 3
        END
    ,TIMESTAMP DESC

1
投票

在Postgres中,我建议使用数组:

order by array_position(array[1, 16, 4], event_id), timestamp desc

0
投票

基本上,如果您的时间戳16等于4的时间戳,那么您可以通过新的时间戳和事件ID对其进行排序。使用窗口函数可以有一个更短的解决方案,但我不确定它是否适用于postgresql

select t1.txn_id, t1.event_id, t1.timestamp, case when t2.min_time is not null then t2.min_time else t1.timestamp end as timestamp2
from table as T1
left join 
(
  select trxn_id, min(timestamp) as min_time
  from table
  group by trxn_id
) as T2
on T1.trxn_id = T2.trxn_id
  and T1.event_id = 16
order by t1.txn_id, timestamp2 desc, t1.event_id, t1.timestamp desc
© www.soinside.com 2019 - 2024. All rights reserved.