Java 用于检索非重复行的SQL查询
我有一个表Java 用于检索非重复行的SQL查询,java,mysql,sql,sql-server,postgresql,Java,Mysql,Sql,Sql Server,Postgresql,我有一个表文档(id,用户id,唯一文档id,版本,日期) 例如: (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\u document\u id和具有max(v
文档
(id
,用户id
,唯一文档id
,版本
,日期
)
例如:
(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\u document\u id
和具有max(version)
的非重复行
输出应该是这样的:(1,1,1001,2,null)
,(1,2,1002,1,null)
我可以通过修改查询来实现这一点,还是需要在其他地方处理?
使用group by unique\u document\u id和max(version)
尝试以下方法
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
如果您使用的是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;
因此,可以通过修改查询来实现。
如果表很大,那么您也可以通过创建索引来考虑性能调整,但是这个查询应该让您开始。 尝试这个,(为MySQL工作)
是的,
groupby
和max(version)
确实是一条路。您需要按所有未聚合的字段进行分组。首先,找出您正在使用的RDBMS。如果您使用的是SQL Server,则可以使用ROW_NUMBER()分析函数来实现这一点。感谢您的帮助。您对此答案有何异议?我不小心单击了两次。
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)