【问题标题】:SQL Select Distinct column and latest dateSQL选择不同的列和最新日期
【发布时间】:2016-07-21 13:26:09
【问题描述】:

我希望只选择基于日期的表的最新记录,但每个 url 只选择一个不同的列表。表结构是这样的;

ID        URL          DateVisited
1         google.com   01-01-2016
2         yahoo.com    01-02-2016
3         google.com   12-30-2015
4         google.com   02-01-2016

所以对于我想要的结果集

google.com     02-01-2016
yahoo.com      01-02-2016

我将在实际查询中添加更多条件,但只想在命中日志中获取单个最新记录,而不是不同 url 和日期的列表,只是不同 url 和最新日期。

【问题讨论】:

标签: sql sql-server distinct greatest-n-per-group


【解决方案1】:

使用简单的聚合实际上很容易做到这一点,如下所示:

select URL, max(DateVisited)
from <table>
group by URL

【讨论】:

  • 工作得很好,我已经这样做了,但是将 dtVisited 包含在我的 group by 子句中会给我带来不想要的结果,我知道这比我想象的要容易!
  • 效果很好!谢谢!
  • 如果您还想要返回行的 PKID,怎么办?有没有同样巧妙的方法? - 或者您是否必须像 Gordon Linoff 的回答中所显示的那样处理 row_numbers 和分区?
  • @Geo... 返回 id 的麻烦在于,一个 URL 可能有多个 id。查看问题中的示例数据。 URL google.com 出现 3 个不同的 ID:1、3 和 4。如果您只对其中一个感兴趣,比如最小值或最大值,您可以在查询中添加另一个聚合函数,例如 min(id)max(id)。一些 SQL 数据库甚至支持返回数组和所有 id 的逗号分隔列表的聚合函数。例如,查看 PostgreSQL 的 array_agg()string_agg(),或 MySQL 的 group_concat()。使用count()统计id个数
【解决方案2】:

这通常使用row_number()

select t.*
from (select t.*,
             row_number() over (partition by url order by datevisited desc) as seqnum
      from t
     ) t
where seqnum = 1;

这允许您获取与最新记录关联的所有列。

【讨论】:

  • 因为他不需要 id 我认为 vanilla max/group 就足够了
  • 这将返回所有分组依据的记录,它应该是唯一的URL
  • @KEVALPANCHAL 。 . .这将返回每 url 一行。
最近更新 更多