如何在MySQL中查询按年月分组的商品最近5条唯一价格记录
你现有语句的问题在于 SELECT DISTINCT 仅会对monthyear、itemname、rate三个字段完全相同的记录去重,既没有按时间排序逻辑,也没有筛选最近记录的规则,因此无法得到预期结果。
以下是通用可行的查询方案,默认你使用的数据库支持窗口函数(MySQL 8.0+、PostgreSQL、SQL Server、Oracle 均支持),且表中存在精确的交易时间字段txn_date(用于区分同月内多条价格记录的先后顺序,若无该字段可调整为你实际的排序字段):
方案1:按商品维度取每个商品最近5组价格记录(同月调价多条全部保留)
WITH ranked_transaction AS ( SELECT monthyear, itemname, rate, -- 按商品分组,按交易时间倒序排名,相同月份的记录排名一致 DENSE_RANK() OVER (PARTITION BY itemname ORDER BY monthyear DESC, txn_date DESC) AS rank_num FROM av_products_txn ) SELECT monthyear, itemname, rate FROM ranked_transaction WHERE rank_num <= 5 ORDER BY itemname, monthyear DESC, txn_date DESC;
方案2:全局取所有商品的最近5条价格记录
如果不需要按商品分组,仅需要全局按时间倒序取最近5条,直接排序后限制条数即可:
-- MySQL/PostgreSQL 写法 SELECT monthyear, itemname, rate FROM av_products_txn ORDER BY txn_date DESC LIMIT 5; -- SQL Server 写法 SELECT TOP 5 monthyear, itemname, rate FROM av_products_txn ORDER BY txn_date DESC; -- Oracle 写法 SELECT monthyear, itemname, rate FROM av_products_txn WHERE ROWNUM <= 5 ORDER BY txn_date DESC;
内容的提问来源于stack exchange,提问作者vickeyb4u
相关产品推荐
相关产品推荐

