SQL查询无法返回最大日期,请求排查语句问题
嘿,我来帮你排查这个SQL问题~
你现在的查询拿不到最新日期对应的cst_at,核心问题出在聚合函数和普通列的搭配逻辑不对:
- 当你把
MAX(dts_srv_ts)和chg_cod_ext_id、cst_at一起放在SELECT里时,数据库要么会要求你把非聚合列加到GROUP BY里,要么直接报错(比如SQL Server就会这么干)。但就算加上GROUP BY,你也没法保证取到的cst_at是对应那个最大日期的行——因为同一个chg_cod_ext_id可能有多条不同的cst_at记录,数据库不知道该挑哪一个。
给你两种靠谱的解决方案
都是针对SQL Server环境的,你可以选顺手的用:
方案1:用窗口函数标记最新行
窗口函数能给每个chg_cod_ext_id的记录按日期排序,直接把最新的那条挑出来:
WITH RankedRecords AS ( SELECT m.chg_cod_ext_id, c.cst_at, d.dts_srv_ts, -- 按收费编码分组,日期倒序排,最新的行标成1 ROW_NUMBER() OVER (PARTITION BY m.chg_cod_ext_id ORDER BY d.dts_srv_ts DESC) AS rn FROM dbo.TRX101_THERAPY_ITEM t INNER JOIN dbo.TRX202_ITEM_CHARGE c ON t.prx_itm_int_id = c.prx_itm_int_id INNER JOIN dbo.TRX111_ITEM_DISPENSE d ON t.prx_itm_int_id = d.prx_itm_int_id INNER JOIN dbo.TPB900_CHG_CODE_MST m ON -- 这里得补全你原来的关联条件哦,比如c.chg_cod_int_id = m.chg_cod_int_id? ) SELECT chg_cod_ext_id, cst_at, dts_srv_ts FROM RankedRecords WHERE rn = 1; -- 只留最新的那一行
如果同一个编码在同一时间有多条记录,想全部保留的话,把ROW_NUMBER()换成RANK()就行。
方案2:先找最大日期再关联回原表
先查出每个编码对应的最新日期,再通过这个日期关联回原表拿对应的cst_at:
SELECT m.chg_cod_ext_id, c.cst_at, max_dates.max_dts_srv_ts AS dts_srv_ts FROM ( -- 先按编码分组,拿到每个组的最大日期 SELECT m.chg_cod_ext_id, MAX(d.dts_srv_ts) AS max_dts_srv_ts FROM dbo.TRX101_THERAPY_ITEM t INNER JOIN dbo.TRX202_ITEM_CHARGE c ON t.prx_itm_int_id = c.prx_itm_int_id INNER JOIN dbo.TRX111_ITEM_DISPENSE d ON t.prx_itm_int_id = d.prx_itm_int_id INNER JOIN dbo.TPB900_CHG_CODE_MST m ON -- 记得补全关联条件 GROUP BY m.chg_cod_ext_id ) AS max_dates -- 关联回所有表,找到对应最大日期的那条记录 INNER JOIN dbo.TRX101_THERAPY_ITEM t ON ... -- 补全关联逻辑 INNER JOIN dbo.TRX202_ITEM_CHARGE c ON ... INNER JOIN dbo.TRX111_ITEM_DISPENSE d ON d.dts_srv_ts = max_dates.max_dts_srv_ts AND ... INNER JOIN dbo.TPB900_CHG_CODE_MST m ON m.chg_cod_ext_id = max_dates.chg_cod_ext_id AND ...;
小提醒
记得把查询里缺失的表关联条件补全哦,不然跑不起来~
内容的提问来源于stack exchange,提问作者Milan Pk
相关产品推荐
相关产品推荐

