我有一个表存储一些关于网址的报告,他们有一个像created_date这样的字段。可以多次生成(和存储)相同的报告,因为值可以更改。我如何获得网址报告,但只是最新报告?
我的桌子(page_report):
id INT PK
url VARCHAR(255)
created_date TIMESTAMP
示例数据:
id url created_date
1 google.com 2016-11-01
2 google.com 2016-11-05
3 bing.com 2016-11-03
4 bing.com 2016-11-06
我需要:
id url created_date
1 google.com 2016-11-05
2 bing.com 2016-11-06
到目前为止我所拥有的:
SELECT r1.*
FROM page_report r1
LEFT JOIN page_report r2 ON r1.url = r2.url AND r1.created_date < r2.created_date
WHERE r2.url IS NULL;
但它很慢。还有更好的办法吗?
希望我事先明确并表示感谢!
答案 0 :(得分:1)
一种方法是通过Some ID / Logical Key生成最大记录的日期集。
如果我假设一个名为ID的字段是网址的分组机制......
SELECT T1.URL, T1.Created_Date
FROM TableEName T1
INNER JOIN (SELECT MAX(Created_Date) CD, ID
FROM TableName
GROUP BY ID)
on T1.ID = T2.ID
and T1.Created_Date = T2.CD
这里的诀窍是我们如何知道URL“已更改”它们是否具有相同的ID或其他一些随时间保持不变的属性?
答案 1 :(得分:0)
使用UNION ALL
,然后按url
分组,然后选择MAX(created_date)
。
SELECT t.url, MAX(t.created_date)
FROM (SELECT * FROM table1 UNION ALL SELECT * FROM table2) t
GROUP BY t.url
有关详细信息,请参阅myql's UNION documentation。
答案 2 :(得分:0)
我一直跟这个:
SELECT DISTINCT r1.url FROM page_report r1
LEFT JOIN page_report r2 ON r1.url = r2.url AND r1.created_date < r2.created_date
WHERE r2.url IS NULL;
答案 3 :(得分:-1)
为最新的创建日期创建排名函数。像下面的东西。
select * from (select distinct DENSE_RANK () OVER (PARTITION BY url ORDER BY B.CreatedDate desc) Rnk, t.url )
where rnk =1