我认为我可以将这种情况与CamelCamelCamel,Keepa等服务进行比较。可以说,我跟踪了两个国家/地区每天的商品价格。所以我的桌子,叫它Trend,看起来像这样
Trend
Id Created ArticleId Country Price ------------------------------------------------- 01 19/11/05 452 US 45.90 02 19/11/05 452 CA 52.99 03 19/11/05 452 MX 99.99 04 19/11/06 452 US 20.00 05 19/11/06 452 CA 25.00 06 19/11/06 452 MX 50.00 ... 97 19/11/05 738 US 12.99 98 19/11/05 738 CA 17.50 99 19/11/05 738 MX 45.50
所以是第二天,我想更新Trend表格。如果某个国家/地区的价格仍然相同,则跳过商品/国家/地区组合。如果有新价格,我将添加新记录。
现在,我想查询表以获取每个ArticleId/Country组合。但是只有它的最后一条记录(按时间戳排序)。所以采取上述我期望得到记录的例子04,05并06为ArticleId 452。不01,02和03
ArticleId
Country
04
05
06
452
01
02
03
因此,我从这个基本查询开始。但是,如何更改它以达到预期效果?
SELECT * FROM Trend ORDER BY Created DESC
一种方法使用相关子查询进行过滤:
select t.* from trend t where t.created = ( select max(t1.created) from trend t1 where t1.articleId = t.articleId and t1.country = t.country )
为了提高性能,您需要在上建立索引(articleId, country, created)。
(articleId, country, created)
您可能还需要考虑反left join方法:
left join
select t.* from trend t left join trend t1 on t1.articleId = t.articleId and t1.country = t.country and t1.created > t.created where t1.articleId is null
最后,另一种典型的解决方案是使用汇总查询将表连接起来:
select t.* from trend t inner join ( select articleId, country, max(created) created from trend group by articleId, country ) t1 on t1.articleId = t.articleId and t1.country = t.country and t1.created = t.created
哪种解决方案效果更好取决于数据的大小和分布。