PostgreSql: результат заказа - II - PullRequest
2 голосов
/ 19 июля 2011

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.

Любая помощь приветствуется.

Спасибо

1 Ответ

3 голосов
/ 19 июля 2011
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
;

Ваши выходные данные не совпадают с входными. Например, временная метка входного идентификатора # 7 равна 190, а одна из выходных - 120. Поэтому проверьте свои выходные данные, прежде чем считать этот запрос неправильным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...