2017-11-03 9 views
0

次のスキーマとサンプル値を持つ表があります。別の列の値に基づいてmax(列の値)を取得する方法

enter image description here

私は、接続されている状態だけでなく、切断状態のために、各ユーザにその最大(タイムスタンプ)のために私を与えるクエリを記述しようとしています。私が探しています必要なクエリの出力スキーマの

例は次のとおりです。

ユーザー名| Connected_MAX_Timestamp | Disconnected_MAX_Timestamp

私が試したクエリはこれです:

名によるグループsocketinfoからSELECTのユーザー名、socketstatus、MAX(タイムスタンプ)、socketstatus

と同じのための出力は次のとおりです。

enter image description here

必要な出力を達成する方法を教えてもらえますか?

+0

を、これがピボットテーブルです。変数(接続/切断)の2つの値だけをピボットするのはやや珍しいですが、それは実行しようとしている操作です。 –

答えて

1
SELECT t1.username, 
     t1.socketstatus, 
     max(t1.timestamp) AS "Connected_MAX_Timestamp", 
     t2.username, 
     t2.socketstatus, 
     max(t2.timestamp) "Disconnected_MAX_Timestamp" 
FROM socketinfo t1, 
    socketinfo t2 
WHERE t1.socketstatus='Connected' 
    AND t2.socketstatus='Disconnected' 
    AND t1.username=t2.username 
GROUP BY t1.username, 
     t1.socketstatus, 
     t2.username, 
     t2.socketstatus; 

あなたの質問が正しく理解されていれば、これはPostgres 9.5でも動作します。

+0

それは、このようなクリーンなコードのおかげで動作します:) –

+0

さらにこのコードでは、max(conn_TS、disconn_TS)だけを保持する必要がありますか? –

+0

私はmax(max_conn_TS、max_disconn_TS)を意味しますか?それは実際に究極の目標だった –

2

だけ条件集合を使用:将来の参照のため

select username, 
     max(case when socketstatus = 'Connected' then timestamp end) as max_connected_timestamp, 
     max(case when socketstatus = 'Disconnected' then timestamp end) as max_disconnected_timestamp, 
from socketinfo 
group by username; 
+0

ありがとうございます。 このコードでは、max(max_conn、max_disconn)を保持するために何かを行うことはできますか? –

+0

@AmrataRamchandani。 。 。 'max(socketstatus in( 'Connected'、 'Disconnected')、そしてtimestamp endの場合)を希望しない限り、私はあなたのコメントを理解しません。 –

+0

いいえ、私が意味していたのは、max_of_connectedとmax_disconnectedを見つけて、この2つのMAXの間で2つの最大値を見つけることでした。 –

関連する問題