首页 > 解决方案 > MySql最后一条记录按item_id分组,按日期排序

问题描述

我的数据库表名是 ledgers,字段是id、item_id、date、...其他字段

我想要来自(groupBy item_id order by date ASC)的最后一条记录。从每个组。我试过下面的查询

select 
    `id`, 
    `item_id`, 
    `date`, 
    `opening_quantity`, 
    `closing_quantity`, 
    `item_rate`, 
    `item_value`, 
    `previous_rate` 
from `ledgers` 
where date(`date`) >= ? and date(`date`) <= ? 
group by `item_id` 
order by `date` desc

你们能帮忙吗。

标签: mysqlsqldatesubquerygreatest-n-per-group

解决方案


您可以使用相关子查询进行过滤:

select t.*
from `ledgers` t
where 
    date(t.`date`) >= ? 
    and date(t.`date`) <= ?
    and t.`date` = (
        select max(t1.`date`)
        from `ledgers` t1
        where t1.`item_id` = t.`item_id`
    )

对于性能,请考虑在(item_id, date).

另一种选择是使用rank()(仅在 MySQ 8.0 中可用):

select * 
from (
    select 
        t.*,
        rank() over(partition by `item_id` order by `date` desc) rn
    from `ledgers` t
    where  date(t.`date`) >= ? and date(t.`date`) <= ?
) t
where rn = 1

推荐阅读