2017-09-18 3 views
0

私はこれを以下の表に示します。PostgreSQL:このシナリオのクエリを書く方法

+_______+________+__________+________+ 
|Playid |billid| amount | Date | 
+_______+________+__________+________+ 
|123 | 345 | 144.9 | 2015-09| 
|123 | 456 | 200  | 2015-10| 
+_______+________+__________+________+ 

以下のような最新の取引日(日付)の請求金額のみを表示するクエリを作成する必要があります。

+_______+________+__________+________+ 
|Playid |billid| amount | Date | 
+_______+________+__________+________+ 
|123 | 456 | 200  | 2015-10| 
+_______+________+__________+________+ 

どうすればいいですか?

+1

これまでに何を試みましたか? –

+0

@FerdinandGaspar私はselectとhaving節でcase文を使ってmax(Date)を使用しようとしましたが、期待通りに機能しませんでした。 –

+0

@ KushalLNU答えとして「感謝」を掲示するのではなく、あなたの問題を解決した答えの投票矢印の下にあるマークをクリックするだけで、正しい答えの1つを受け入れる必要があります – Hadi

答えて

1

MAX(Date)は、playidと最新の日付のみを表示する場合に使用できます。

ただし、あなたがしようとしている問題は、すべての列を表示することです。ランキング機能が出現する場所ですこの場合、あなたはこのようなrow_number functionを使用することができます。

SELECT PlayId, billid, amount, date 
FROM 
(
    SELECT 
    PlayId, billid, amount, date, 
    row_number() over(partition by playid order by date dec) as rn 
    FROM tablename 
) t 
where rn = 1 

row_number() over(partition by playid order by date dec)playidの各グループに順位番号、最初の1(最低1)最新の日付のいずれかになりますが得られます。次に、1に等しい行番号をフィルタリングするだけです。

1

Postgresはdistinct onを提供しています。これは簡単に書くことができ、しばしば最高のパフォーマンスを発揮します:

select distinct on (playid) t.* 
from t 
order by playid, order by date desc; 
関連する問題