MySql 按 item_id 分组的最后一条记录,按日期排序

标签 mysql sql date subquery greatest-n-per-group

我的数据库表名称是 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

请大家帮忙。

最佳答案

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

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

关于MySql 按 item_id 分组的最后一条记录,按日期排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58693061/

相关文章:

php - SQL查询返回字段名但不返回值

php - 如何使用 PHP 从表单将数据插入到 mySQL 数据库中?

SQL 查询进行全表扫描而不是基于索引的扫描

javascript - 客户端在服务器上的本地时间

javascript - 获取 HTML5 日期时间本地精确值

MySQL 索引列与连接表

mysql - 编写此 MySQL 查询的更好方法?

mysql - 如何在没有联合运算符的情况下运行此查询?

mysql - 使用多个左连接优化 MySQL 查询

php - 为什么一天不等于 24 小时时区设置为洛杉矶?