用于检索非重复行的SQL查询

时间:2016-11-07 09:49:27

标签: java mysql sql sql-server postgresql

我有一个表documentsiduser_idunique_document_idversiondate)。

条目示例如下:

(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)的东西。

3 个答案:

答案 0 :(得分:0)

试试这个

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

答案 1 :(得分:0)

如果您使用的是sql-server而不是postgresql,那么窗口函数将有所帮助:

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;

所以,是的,你可以通过修改查询来实现它。 如果表非常大,那么您也可以通过创建索引来考虑性能调优,但是此查询应该可以帮助您开始。

答案 2 :(得分:0)

试试这个,(Works for MySql)

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)