【问题标题】:Get most recent status for each category [duplicate]获取每个类别的最新状态 [重复]
【发布时间】:2021-01-31 09:28:28
【问题描述】:

我遇到了这个有趣的问题。我有一个名为 email_track 的表来跟踪每个类别的电子邮件状态,比如(邀请、时事通讯)

这就是我的表格数据的样子,

通过以下这些查询,我可以获得每个 to_email 的最新记录,

with `et2` as (
    select `et1`.`category`, `et1`.`to_email`, `et1`.`subject`, `et1`.`status`, ROW_NUMBER() OVER (partition by `to_email` order by `id` desc) as `rn`
    from `email_track` `et1`
)
select * from `et2` where `rn` = 1;

select `et1`.`category`, `et1`.`to_email`, `et1`.`subject`, `et1`.`status`, `et2`.`id`
from `email_track` `et1`
left join `email_track` `et2` on (`et1`.`to_email` = `et2`.`to_email` and `et1`.`id` < `et2`.`id`)
where `et2`.`id` is null;

我期待的是电子邮件john@example.com 我应该得到两条记录,一条用于类别邀请,另一条用于时事通讯。现在,我们不会得到那个结果,因为我们按to_email 分区

【问题讨论】:

标签: mysql sql sql-order-by greatest-n-per-group window-functions


【解决方案1】:

我应该得到两条记录,一条用于类别邀请,另一条用于时事通讯。现在,我们不会得到那个结果,因为我们按to_email 分区。

category 添加到窗口函数的partition by 子句中应该足以提供您想要的结果:

with et2 as (
    select et1.category, et1.to_email, et1.subject, et1.status, 
        row_number() over(partition by to_email, category order by id desc) as rn
    from email_track et1
)
select * from et2 where rn = 1;

【讨论】:

    猜你喜欢
    • 2021-04-14
    • 2016-12-25
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    • 2019-08-19
    • 1970-01-01
    相关资源
    最近更新 更多