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。查看问题中的示例数据。 URLgoogle.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
一行。以上是关于SQL选择不同的列和最新日期的主要内容,如果未能解决你的问题,请参考以下文章