SQL选择唯一列和最新日期

18

我想根据日期选择表中最新的记录,但只选择每个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和最新的日期。


可能是获取某列最大值所在的行的重复问题。 - Tab Alleman
2个回答

32

使用简单的聚合就可以轻松地完成,像这样:

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

工作得很好,我已经做到了这一点,但是在我的group by子句中包含dtVisited会给我带来不必要的结果,我知道它比我想象的要容易! - Nick G
工作得很好!谢谢! - krisDrOid
如果您还想要返回行的PKID,该怎么办呢?有没有同样简洁的方法?-或者您是否必须像Gordon Linoff的答案中所示一样,在行号和分区中进行操作? 这个可以用什么方式实现呢?如果你同时也希望返回结果行的PKID呢?是否有同样优美的方法?或者,你必须像Gordon Linoff的答案中所示那样使用行号和分区? - Geo...
@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数量。 - Chitharanjan Das

8

通常使用 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;

这可以让您获取与最新记录相关联的所有列。

1
我认为他不需要id,一个普通的max/group就足够了。 - Alex K.
这将返回所有按组分组的记录,应该由URL唯一确定。 - KEVAL PANCHAL
1
@KEVALPANCHAL . . . 这将针对每个“url”返回一行。 - Gordon Linoff
干杯!在某个时候,您可能想要加入一个列,如果您不以这种方式进行,则会破坏您的独特性 :) - Egil Hansen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接