SQL选择唯一列和最新日期

24 浏览
0 Comments

SQL选择唯一列和最新日期

我想根据日期选择表中最新的记录,但每个网址只选择一个不同的列表。表结构如下;

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

我的实际查询中还会有几个条件限制,但我只想获取访问日志中的单个最新记录,而不是不同的网址和日期列表,只需要不同的网址和最新日期。

0
0 Comments

问题的出现原因:

在查询中,需要选择某一列的不重复值,并且选择该列中最新的日期。然而,使用简单的聚合操作时,会出现一些问题。在使用group by子句时,如果将日期列也包含在group by子句中,会导致结果不符合预期。

解决方法:

要解决这个问题,可以使用以下SQL查询语句:

select URL, max(DateVisited)
from 
group by URL

这样就可以选择指定列的不重复值,并且选择该列中最新的日期。

但是,如果还想返回符合条件的行的主键(PKID),是否有同样简洁的方法呢?或者必须像Gordon Linoff的回答中所示,使用row_numbers和partitions来解决呢?

实际上,返回主键存在一些问题,因为一个URL可能有多个主键。例如,在问题的示例数据中,URL "google.com" 出现了3个不同的主键:1、3和4。如果只对其中一个感兴趣,例如最小值或最大值,可以在查询中添加另一个聚合函数,例如min(id)或max(id)。一些SQL数据库甚至支持返回数组和逗号分隔的所有主键的聚合函数。例如,PostgreSQL的array_agg()和string_agg(),或者MySQL的group_concat()。可以使用count()函数计算主键的数量。

通过使用简单的聚合操作,可以解决选择指定列的不重复值,并且选择该列中最新日期的问题。如果需要返回符合条件的行的主键,可以使用其他聚合函数或特定数据库的扩展函数来处理。

0
0 Comments

(SQL Select Distinct column and latest date)问题的出现原因是:需要在SQL查询中选择具有唯一URL的最新日期的数据。直接使用DISTINCT关键字无法满足要求,因为DISTINCT关键字只能去重,无法选择最新日期的数据。

解决方法是使用row_number()函数来实现。首先,通过子查询将原表t中的数据按照URL分组,并按照日期倒序排列,同时使用row_number()函数为每个分组中的记录分配序号。然后,在外层查询中,筛选出序号为1的记录,即每个URL分组中最新日期的数据。这样就能获取到与最新记录相关联的所有列。

具体的SQL查询语句如下:

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

这样就能得到按照URL分组后,每个分组中最新日期的数据,同时包含了所有其他列的数据。

在某些情况下,你可能还需要在查询中加入其他的列,这可能会破坏你的唯一性,如果不按照上述方法进行操作的话。

通过以上的解决方法,我们可以轻松地选择具有唯一URL的最新日期的数据,满足我们的需求。

0