提问者:小点点

按查询分组-选择具有最大日期的行


嗨,我有这个分数表,在我的报告前端,我必须显示的关键字和url和分数为最新扫描。

创建表scores(idint(11)unsigned NOT NULL AUTO_INCREMENT,keywordvarchar(200)DEFAULT NULL,urlvarchar(200)DEFAULT NULL,scoreint(11)DEFAULT NULL,check_datedate DEFAULT NULL,主键(id)))engine=innoDb

下面是我的示例数据:

样本数据

| id | keyword  | url                  | score | check_date |
|----|----------|----------------------|-------|------------|
| 1  | facebook | https://facebook.com | 10    | 2020-10-21 |
| 2  | facebook | https://facebook.com | 30    | 2020-10-25 |
| 3  | fb       | https://facebook.com | 55    | 2020-10-23 |
| 4  | fb       | https://facebook.com | 20    | 2020-10-24 |

我的查询

select s1.* from scores s1
    join scores s2 on s1.id = s2.id
    where s1.check_date = s2.check_date 
group by keyword,url

它为特定的关键字url返回正确的check_date,但score不是根据该日期。 请帮帮我。


共2个答案

匿名用户

不要为此使用聚合。 一个简单的方法是相关子查询:

select s.*
from scores s
where s.check_date = (select max(s2.check_date)
                      from scores s2
                      where s2.keyword = s.keyword and s2.url = s.url
                     );

如果您打算使用显式的联接,则可以使用左联接,查找更大的日期,并返回没有更大日期的行:

select s.*
from scores s left join
     scores slater
     on slater.keyword = s.keyword and
        slater.url = s.url and
        slater.check_date > s.check_date
where slater.check_date is null;

匿名用户

您已经按正确的内容进行了分组,您只需使用max aggregate函数对check_date进行操作

select max(check_date), score, url, keyword
from scores
group by url, keyword

我有一把小提琴你可以试一下

http://sqlfiddle.com/#!9/7 D0FBF/12