我有一个表documents
(id
,user_id
,unique_document_id
,version
,date
)。
条目示例如下:
(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_id
和having max(version)
非重复行。
输出应该是:(1, 1, 1001, 2, null)
,(1, 2, 1002, 1, null)
我可以通过修改查询来实现这一点,还是需要在其他地方处理?
使用group by unique_document_id and max(version)
的东西。
答案 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)