SQL选择不同的列和最新日期

Posted

技术标签:

【中文标题】SQL选择不同的列和最新日期【英文标题】:SQL Select Distinct column and latest date 【发布时间】: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 和最新日期。

【问题讨论】:

Fetch the row which has the Max value for a column的可能重复 【参考方案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(),或 mysqlgroup_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 一行。

以上是关于SQL选择不同的列和最新日期的主要内容,如果未能解决你的问题,请参考以下文章

sql查询计算不同列和相邻行的两个日期之间的差异

查找今天日期和日期列之间的年长

按最新日期获取分组后的列

在 Oracle SQL 中组合不同的日期和时间列以创建一个具有日期/时间格式的列

在 2 个不同的列 sql 中获取 2 个不同日期的数据

Hive SQL - 检索日期范围中存在的列的不同值