如何在一个表上的子选择中使用max函数

时间:2014-09-15 16:50:21

标签: sql max

我在医疗保险登记数据库中有一个查询,用于填充信用证申请的数量。但是我需要lastupd_TS字段来仅过滤最大值。当我这样做时,我收到一个错误:

  

聚合可能不会出现在WHERE子句中,除非它在a中   包含在HAVING子句或选择列表中的子查询以及列   被聚合是一个外部参考。

以下是查询:

Select Distinct CONTACT_ID ,CREATED_TS,LASTUPD_TS,(LASTUPD_TS) as LAST_UPDATE
from tblCCPMedicareSpecific_Archive
where LASTUPD_TS=(Select MAX(lastupd_TS))and (OWNER_DEPT = 'LBECAS POA Enro') AND (CREATED_TS BETWEEN CONVERT(DATETIME, '2013-01-01 00:00:00', 102) AND CONVERT(DATETIME, 
                      '2013-12-31 00:00:00', 102))  

我的问题是如何才能将其过滤到最大值,因为我不能使用having子句,因为此列中有多个日期,我只想输入最大或最后日期

2 个答案:

答案 0 :(得分:0)

这不起作用吗

Select CONTACT_ID, CREATED_TS, MAX(LASTUPD_TS) as LASTUPD_TS, MAX(LASTUPD_TS) as LAST_UPDATE 
from tblCCPMedicareSpecific_Archive 
where (OWNER_DEPT = 'LBECAS POA Enro') AND (CREATED_TS BETWEEN CONVERT(DATETIME, '2013-01-01 00:00:00', 102) AND CONVERT(DATETIME, '2013-12-31 00:00:00', 102))
group by CONTACT_ID, CREATED_TS

答案 1 :(得分:0)

由于你只想要一个DISTINCT行,但只想要MAX的LASTUPD_TS,我认为你最好使用GROUPing。这将为您的GROUP选择仅返回一行(在这种情况下,每个CONTACT_ID和CREATED_TS一行)。我觉得这不是你需要的......每个唯一的CONTACT_ID只有一行吗?特定CONTACT_ID的每一行是否都具有相同的CREATED_TS值?如果是这样,你可以改变 GROUP BY只是CONTACT_ID并使用MIN(CREATED_TS)作为该列的SELECT。

编辑:另外,我建议您也考虑将BETWEEN过滤器更改为CREATED_TS BETWEEN> ='2013-01-01'AND CREATED_TS< '2014-01-01 00:00:00'。当前版本将排除2013年12月31日发生的任何事情,但当天的第一天午夜除外。

SELECT CONTACT_ID
    ,CREATED_TS
    ,MAX(LASTUPD_TS) AS MAX_LASTUPD_TS

FROM tblCCPMedicareSpecific_Archive
WHERE (OWNER_DEPT = 'LBECAS POA Enro')
    AND (
        CREATED_TS BETWEEN CONVERT(DATETIME, '2013-01-01 00:00:00', 102)
            AND CONVERT(DATETIME, '2013-12-31 00:00:00', 102)
        )
GROUP BY CONTACT_ID, CREATED_TS