2016-11-07 7 views
-3

私はテーブルdocumentsiduser_idunique_document_idversiondate)を持っています。SQLクエリは、非重複-行を取得するために

エントリの例は以下のとおりです。

(1, 1, 1001, 1, null), 
(1, 1, 1001, 2, null), 
(1, 2, 1002, 1, null) 

は現在、私は詳細を選択し、表示する問合せがあります

select d.* from documents d 
where d.user_id = 1 
order by d.date desc 
limit 10 
offset 0 

をしかし、私はunique_document_idhaving max(version)を使用して、非重複行をしたいです。

出力は次のようにする必要があります:(1, 1, 1001, 2, null)(1, 2, 1002, 1, null)

は、私は、クエリを変更することによって、これを達成することができますか私は他の場所でこれを処理する必要がありますか? 何かを使用してgroup by unique_document_id and max(version)

+0

(MySQL用のワークス)、これを試してみてください。集計されていないすべてのフィールドでグループ化する必要があります。 –

+8

まず、使用しているRDBMSを特定します。 – Strawberry

+0

SQL Serverを使用している場合は、ROW_NUMBER()分析関数を使用してこれを実現できます。 – Prafulla

答えて

0

あなたは、ウィンドウの機能が役立ちますPostgreSQLのSQLサーバを使用していない場合、この

select d.* from documents d 
INNER JOIN (
SELECT Unique_document_id, MAX(version) version 
from documents 
GROUP BY Unique_document_id) b ON a.Unique_document_id= b.Unique_document_id 
AND a.version = b.version 
+0

ありがとうございました。 – shadab

+0

あなたはこの回答を否定します –

+0

私は誤ってそれを2回クリックしました。 – shadab

0

をお試しください:

だから、
With orderedVersions As (
    Select id, user_id, unique_document_id, Version, [date], RowNo = Row_Number() Over (Partition By Unique_Document_id Order By Version desc) 
     From documents) 
Select id, user_id, unique_document_id, Version, [date] 
    From orderedVersions 
    Where RowNo = 1; 

、はいクエリを変更することによって、それを達成することができます。 テーブルが非常に大きい場合は、インデックスを作成してパフォーマンスチューニングを検討することもできますが、このクエリを開始する必要があります。

0

はい、 `グループはby`と` MAX(バージョン) `実際に行くための方法だろう

select a.* from doc_table a 
where (a.user_id, a.Unique_document_id, a.version) in 
(select d.user_id, d.Unique_document_id, max(d.version) 
from doc_table d group by d.user_id, d.Unique_document_id) 
関連する問題