SQL查询未返回最大日期

时间:2018-03-30 13:41:08

标签: sql-server aggregate-functions greatest-n-per-group

有人可以查看我的查询,让我知道为什么不拉最大值(最新日期)?

我想通过最新的dts_srv_ts(datetime)获取cst_at。

这是我的代码:

SELECT 
dbo.TPB900_CHG_CODE_MST.chg_cod_ext_id, 
--max(dbo.TRX202_ITEM_CHARGE.cst_at),
dbo.TRX202_ITEM_CHARGE.cst_at,
MAX(dbo.TRX111_ITEM_DISPENSE.dts_srv_ts) AS dts_srv_ts

FROM 
dbo.TRX101_THERAPY_ITEM
INNER JOIN dbo.TRX202_ITEM_CHARGE on dbo.TRX101_THERAPY_ITEM.prx_itm_int_id = dbo.TRX202_ITEM_CHARGE.prx_itm_int_id 
INNER JOIN dbo.TPB900_CHG_CODE_MST ON dbo.TRX202_ITEM_CHARGE.bas_chg_cod_int_id = dbo.TPB900_CHG_CODE_MST.chg_cod_int_id 
INNER JOIN dbo.TRX111_ITEM_DISPENSE ON dbo.TRX202_ITEM_CHARGE.itm_dpn_int_id = dbo.TRX111_ITEM_DISPENSE.itm_dpn_int_id

WHERE   
dbo.TPB900_CHG_CODE_MST.chg_cod_ext_id = '440001'  

GROUP BY dbo.TPB900_CHG_CODE_MST.chg_cod_ext_id,
dbo.TRX202_ITEM_CHARGE.cst_at
order by dbo.TPB900_CHG_CODE_MST.chg_cod_ext_id

这是我得到的结果:

chg_cod_ext_id     cst_at     dts_srv_ts
440001              1.6500   2014-06-24 15:26:52.000
440001              8.8440   2015-01-26 12:22:24.000
440001              13.6070  2015-12-23 02:12:10.000
440001              16.7080  2017-04-30 07:56:04.000
440001              16.7310  2016-09-04 21:25:12.000
440001              16.9080  2017-08-26 05:14:27.000
440001              17.0090  2016-06-03 07:52:29.000
440001              17.0580  2018-03-26 11:15:29.000
440001              17.5460  2017-12-19 11:11:13.000

这就是我想要的:

chg_cod_ext_id     cst_at     dts_srv_ts
440001             17.0580    2018-03-26 11:15:29.000

非常感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

这里的问题是你在cst_at上进行分组。如果您在另一列上使用max,则必须对此进行分组,但它会自然地更改分组,并且不会返回您想要的结果。快速解决方法是row_number()。您也可以使用内部联接或相关子查询来执行此操作。祝Paragon好运!

;with cte as(
SELECT 
dbo.TPB900_CHG_CODE_MST.chg_cod_ext_id, 
dbo.TRX202_ITEM_CHARGE.cst_at,
dbo.TRX111_ITEM_DISPENSE.dts_srv_ts,
RN = row_number() over (partition by dbo.TPB900_CHG_CODE_MST.chg_cod_ext_id order by dbo.TRX111_ITEM_DISPENSE.dts_srv_ts desc)

FROM 
dbo.TRX101_THERAPY_ITEM
INNER JOIN dbo.TRX202_ITEM_CHARGE on dbo.TRX101_THERAPY_ITEM.prx_itm_int_id = dbo.TRX202_ITEM_CHARGE.prx_itm_int_id 
INNER JOIN dbo.TPB900_CHG_CODE_MST ON dbo.TRX202_ITEM_CHARGE.bas_chg_cod_int_id = dbo.TPB900_CHG_CODE_MST.chg_cod_int_id 
INNER JOIN dbo.TRX111_ITEM_DISPENSE ON dbo.TRX202_ITEM_CHARGE.itm_dpn_int_id = dbo.TRX111_ITEM_DISPENSE.itm_dpn_int_id

WHERE   
dbo.TPB900_CHG_CODE_MST.chg_cod_ext_id = '440001')

select * from cte where RN = 1

答案 1 :(得分:0)

如果您要按ID查找最新日期,可以尝试直接max()?

SELECT 
dbo.TPB900_CHG_CODE_MST.chg_cod_ext_id, 
MAX(dbo.TRX111_ITEM_DISPENSE.dts_srv_ts) AS dts_srv_ts

FROM 
dbo.TRX101_THERAPY_ITEM
INNER JOIN dbo.TRX202_ITEM_CHARGE on dbo.TRX101_THERAPY_ITEM.prx_itm_int_id = dbo.TRX202_ITEM_CHARGE.prx_itm_int_id 
INNER JOIN dbo.TPB900_CHG_CODE_MST ON dbo.TRX202_ITEM_CHARGE.bas_chg_cod_int_id = dbo.TPB900_CHG_CODE_MST.chg_cod_int_id 
INNER JOIN dbo.TRX111_ITEM_DISPENSE ON dbo.TRX202_ITEM_CHARGE.itm_dpn_int_id = dbo.TRX111_ITEM_DISPENSE.itm_dpn_int_id

WHERE dbo.TPB900_CHG_CODE_MST.chg_cod_ext_id = '440001'  
GROUP BY dbo.TPB900_CHG_CODE_MST.chg_cod_ext_id
order by dbo.TPB900_CHG_CODE_MST.chg_cod_ext_id

答案 2 :(得分:0)

当您包含其他两列时,您将返回与这些列组合相关的最大日期时间。

一种方法是取MAX(dbo.TRX111_ITEM_DISPENSE.dts_srv_ts)而不包括其他两列。这将返回Max Datetime。可以使用HAVING对此聚合值过滤完整查询。以下是使用变量存储最大日期时间的一种方法:

--Save the maxdatetime to a variable
DECLARE @maxdatetime datetime = 
(
SELECT 
MAX(dbo.TRX111_ITEM_DISPENSE.dts_srv_ts) AS dts_srv_ts

FROM 
dbo.TRX101_THERAPY_ITEM
INNER JOIN dbo.TRX202_ITEM_CHARGE on dbo.TRX101_THERAPY_ITEM.prx_itm_int_id = dbo.TRX202_ITEM_CHARGE.prx_itm_int_id 
INNER JOIN dbo.TPB900_CHG_CODE_MST ON dbo.TRX202_ITEM_CHARGE.bas_chg_cod_int_id = dbo.TPB900_CHG_CODE_MST.chg_cod_int_id 
INNER JOIN dbo.TRX111_ITEM_DISPENSE ON dbo.TRX202_ITEM_CHARGE.itm_dpn_int_id = dbo.TRX111_ITEM_DISPENSE.itm_dpn_int_id

WHERE   
dbo.TPB900_CHG_CODE_MST.chg_cod_ext_id = '440001'  

GROUP BY dbo.TPB900_CHG_CODE_MST.chg_cod_ext_id,
dbo.TRX202_ITEM_CHARGE.cst_at
)

--Query, filtering the aggregate with HAVING
SELECT 
dbo.TPB900_CHG_CODE_MST.chg_cod_ext_id, 
dbo.TRX202_ITEM_CHARGE.cst_at,
MAX(dbo.TRX111_ITEM_DISPENSE.dts_srv_ts) AS dts_srv_ts

FROM 
dbo.TRX101_THERAPY_ITEM
INNER JOIN dbo.TRX202_ITEM_CHARGE on dbo.TRX101_THERAPY_ITEM.prx_itm_int_id = dbo.TRX202_ITEM_CHARGE.prx_itm_int_id 
INNER JOIN dbo.TPB900_CHG_CODE_MST ON dbo.TRX202_ITEM_CHARGE.bas_chg_cod_int_id = dbo.TPB900_CHG_CODE_MST.chg_cod_int_id 
INNER JOIN dbo.TRX111_ITEM_DISPENSE ON dbo.TRX202_ITEM_CHARGE.itm_dpn_int_id = dbo.TRX111_ITEM_DISPENSE.itm_dpn_int_id

WHERE   
dbo.TPB900_CHG_CODE_MST.chg_cod_ext_id = '440001'  

GROUP BY dbo.TPB900_CHG_CODE_MST.chg_cod_ext_id,
dbo.TRX202_ITEM_CHARGE.cst_at

HAVING MAX(dbo.TRX111_ITEM_DISPENSE.dts_srv_ts) = @maxdatetime

order by dbo.TPB900_CHG_CODE_MST.chg_cod_ext_id