You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL查询:获取每个ATK类物品max(tanggal)对应行的字段值

解决ATK类物品最新库存记录查询问题

问题分析

你当前的查询存在两个核心问题:

  1. GROUP BY 中包含了 tanggal,导致会按「物品+日期」分组,无法得到每个物品的单条最新记录
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 15:38:13