2

REFER: postgresql: 有序结果

我问了这个问题并接受了答案。好吧,在问我的时候,我的想法有所不同,但我被接受的答案说服了。好吧,我最近意识到接受的答案不是我想要的。好吧,我重申一下这个问题:

我有一张看起来像的桌子:

 id | user_id | activity_id | activity_type | root_id | is_root | timestamp 
----+---------+-------------+---------------+---------+---------+-----------
  1 |       1 |           1 | text          |       1 |       1 |       200
  2 |       2 |           2 | text          |       1 |       0 |       206
  3 |       3 |           3 | text          |       1 |       0 |       210
  4 |       2 |          10 | text          |      10 |       1 |        50
  5 |       1 |          11 | text          |      10 |       0 |        90
  6 |       3 |          12 | text          |      10 |       0 |       100
  7 |       3 |          20 | text          |      20 |       1 |       120
  8 |       2 |          21 | text          |      20 |       0 |       130
  9 |       3 |          22 | text          |      20 |       0 |       150
 10 |       3 |          22 | text          |      20 |       0 |       150
 11 |       3 |          22 | text          |      20 |       0 |       190

我正在寻找的输出是:

 id | user_id | activity_id | activity_type | root_id | is_root | timestamp 
----+---------+-------------+---------------+---------+---------+-----------
  1 |       1 |           1 | text          |       1 |       1 |       200
  2 |       2 |           2 | text          |       1 |       0 |       206
  3 |       3 |           3 | text          |       1 |       0 |       210
  7 |       3 |          20 | text          |      20 |       1 |       120
  8 |       2 |          21 | text          |      20 |       0 |       130
 11 |       3 |          22 | text          |      20 |       0 |       150
  9 |       3 |          22 | text          |      20 |       0 |       150
 10 |       3 |          22 | text          |      20 |       0 |       190
  4 |       2 |          10 | text          |      10 |       1 |        50
  5 |       1 |          11 | text          |      10 |       0 |        90
  6 |       3 |          12 | text          |      10 |       0 |       100
  • root_id 应该放在一个组中,并且该组的第一行应该有 is_root = 1。
  • 组应根据根 DESC 的时间戳进行排序,但根的子项应按 ASC 排序(基于时间戳)

The relevant columns for the question is root_id, is_root, timestamp.

任何帮助表示赞赏。

谢谢

4

1 回答 1

3
select
    id,
    user_id, 
    activity_id,
    activity_type,
    t.root_id,
    is_root,
    timestamp
from t
inner join (
    select root_id, max(timestamp) as root_id_max_timestamp
    from t
    group by root_id
) root_id_timestamp on t.root_id = root_id_timestamp.root_id
order by
    root_id_max_timestamp desc,
    is_root = 1 desc,
    timestamp
;

您的输出样本数据与输入不同。例如,输入 id #7 的时间戳是 190,而输出之一是 120。因此,在您认为此查询错误之前检查您的输出。

于 2011-07-19T00:18:40.037 回答