2011-07-18 19 views
2

REFER:postgresql: ordered resultPostgreSQL:注文結果 - II

私はこの質問をし、答えを受け入れました。まあ、私は心の中で何か違うものを求めていましたが、私は受け入れられた答えによって確信していました。さて、私は最近、受け入れられた答えは私が望むものではないことに気付きました。まあ、私は質問を修正再表示しています:

私がどのように見える表ました:

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のタイムスタンプに基づいてソートする必要がありますが、rootの子LDはASC(タイムスタンプベース)

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

任意の助けを理解されソートさ。

おかげ

答えて

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ですが、出力の1つは120です。このクエリを間違っているとみなす前に、出力を確認してください。

+0

入力が間違っています。入力ID#7は120にする必要があります。ありがとうございます。 – Mayank

+0

+1の正しい解決策:) –

関連する問題