【问题标题】:SQL Query to Retrieve Non-Duplicate-Row [duplicate]检索非重复行的 SQL 查询 [重复]
【发布时间】:2016-11-07 09:49:26
【问题描述】:

我有一张桌子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)的东西。

【问题讨论】:

  • 是的,group bymax(version) 确实是要走的路。您需要按所有未聚合的字段进行分组。
  • 首先,确定您使用的是哪个 RDBMS。
  • 如果你使用的是SQL Server,可以使用ROW_NUMBER()解析函数来实现。

标签: java mysql sql sql-server postgresql


【解决方案1】:

试试这个

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

【讨论】:

  • 谢谢你的工作。
  • 你否定这个答案
  • 我不小心点击了两次。
【解决方案2】:

如果您使用的是 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;

所以,是的,您可以通过修改查询来实现。 如果表非常大,那么您还可以考虑通过创建索引来调整性能,但这个查询应该可以帮助您入门。

【讨论】:

    【解决方案3】:

    试试这个,(适用于 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-07
      • 1970-01-01
      • 2021-11-07
      • 1970-01-01
      • 2013-02-15
      相关资源
      最近更新 更多