admin

如何获得2列组合的最后记录?

sql

我认为我可以将这种情况与CamelCamelCamel,Keepa等服务进行比较。可以说,我跟踪了两个国家/地区每天的商品价格。所以我的桌子,叫它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组合。但是只有它的最后一条记录(按时间戳排序)。所以采取上述我期望得到记录的例子040506ArticleId
452。不010203

因此,我从这个基本查询开始。但是,如何更改它以达到预期效果?

SELECT
    *
FROM
    Trend
ORDER BY 
    Created DESC

阅读 167

收藏
2021-06-07

共1个答案

admin

一种方法使用相关子查询进行过滤:

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)

您可能还需要考虑反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

哪种解决方案效果更好取决于数据的大小和分布。

2021-06-07