SQL查询:获取每个ATK类物品max(tanggal)对应行的字段值
解决ATK类物品最新库存记录查询问题
问题分析
你当前的查询存在两个核心问题:
GROUP BY中包含了tanggal,导致会按「物品+日期」分组,无法得到每个物品的单条最新记录simas_mutasi.sisa未使用聚合函数,数据库会返回分组内的随机sisa值,无法保证与MAX(tanggal)对应
正确解法
方法1:使用窗口函数(推荐,适配MySQL 8.0+、PostgreSQL、SQL Server等支持窗口函数的数据库)
通过ROW_NUMBER()按物品分组、日期倒序排序,直接取每组的第一条最新记录:
SELECT nama, tanggal, sisa FROM ( SELECT sb.nama, sm.tanggal, sm.sisa, ROW_NUMBER() OVER (PARTITION BY sb.id ORDER BY sm.tanggal DESC) AS rn FROM ws_fh.simas_mutasi sm INNER JOIN ws_fh.simas_barang sb ON sb.id = sm.kode_barang WHERE sb.jenis = 'ATK DAN SEJENISNYA' AND sm.tanggal BETWEEN '2022-06-01' AND '2022-06-30' -- 修正:6月无31日,调整为30日 ) t WHERE rn = 1;
方法2:子查询获取最大日期后关联(兼容低版本MySQL)
先查询每个ATK物品的最新日期,再关联原表匹配对应的sisa值:
SELECT sb.nama, sm.tanggal, sm.sisa FROM ws_fh.simas_barang sb INNER JOIN ws_fh.simas_mutasi sm ON sb.id = sm.kode_barang INNER JOIN ( SELECT kode_barang, MAX(tanggal) AS max_tanggal FROM ws_fh.simas_mutasi WHERE tanggal BETWEEN '2022-06-01' AND '2022-06-30' GROUP BY kode_barang ) max_dates ON sm.kode_barang = max_dates.kode_barang AND sm.tanggal = max_dates.max_tanggal WHERE sb.jenis = 'ATK DAN SEJENISNYA';
关键修正点
- 修正日期范围错误:将无效的
2022-06-31改为2022-06-30 - 确保每个物品仅返回最新日期对应的记录,且
sisa与该日期完全匹配
内容的提问来源于stack exchange,提问作者fathimah
相关产品推荐
相关产品推荐

