这就是我想要做的。
我有以下样本数据。
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
下面。
我认为你可以为event_id
预定义一个层次结构,首先按它排序,然后按TIMESTAMP DESC
排序。
ORDER BY CASE event_id
WHEN 4
THEN 1
WHEN 16
THEN 2
WHEN 1
THEN 3
END
,TIMESTAMP DESC
在Postgres中,我建议使用数组:
order by array_position(array[1, 16, 4], event_id), timestamp desc
基本上,如果您的时间戳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