SELECT MAX Date T-SQL子查询

时间:2011-03-30 11:30:11

标签: sql sql-server tsql subquery

我正在尝试使用像这样的查询从表中选择行

SELECT     pminf_member, pminf_schmem
         , pminf_date, pminf_fund
         , pminf_cont, pminf_rate
         , pminf_matrix
FROM   pe_minvf
WHERE (pminf_member = 4380) 
  AND (pminf_schmem = 'M') 
  AND (pminf_date <= '03/30/2011')
  AND (pminf_date =
           (SELECT MAX(pminf_date) AS Expr1
            FROM   pe_minvf AS pe_minvf_1
            WHERE  (pminf_member = 4380)
           )
       )
  AND (pminf_fund = 'LIFESTYLE')

我应该从子查询中得到的内容(我认为)是'01 / 01/2011'的日期,但是当我运行查询时,我得不到任何结果。

如果我用硬编码日期替换子查询,我会返回正确的行。例如

SELECT  pminf_member, pminf_schmem
      , pminf_date, pminf_fund
      , pminf_cont, pminf_rate
      , pminf_matrix
FROM  pe_minvf
WHERE (pminf_member = 4380)
  AND (pminf_schmem = 'M')
  AND (pminf_date <= '03/30/2011')
  AND (pminf_date = '01/01/2011')
  AND (pminf_fund = 'LIFESTYLE')

此查询返回正确的结果。

为什么子查询没有返回最大日期的任何想法,或者如果是,为什么我没有返回任何行?

谢谢, 特里斯坦

5 个答案:

答案 0 :(得分:6)

您可以根据查询中的不同条件进行过滤。

子查询中为pminf_fund = 'LIFESTYLE',但外部查询中为pminf_schmem = 'M'

此外,您还限制外部查询中的日期,而不是在子查询中执行此操作。

如果您只需要最新的'03 / 30/2011'记录,请使用:

SELECT  TOP 1
        pminf_member, pminf_schmem, pminf_date, pminf_fund, pminf_cont, pminf_rate, pminf_matrix
FROM    pe_minvf
WHERE   pminf_member = 4380
        AND pminf_schmem = 'M'
        AND pminf_fund = 'LIFESTYLE'
        AND pminf_date <= '03/30/2011'
ORDER BY
        pminf_date DESC

答案 1 :(得分:1)

SELECT     pminf_member, pminf_schmem
         , pminf_date, pminf_fund
         , pminf_cont, pminf_rate
         , pminf_matrix
FROM   pe_minvf 
WHERE (pminf_member = 4380) 
  AND (pminf_schmem = 'M') 
  AND (pminf_date =
           (SELECT MAX(pminf_date) AS Expr1
            FROM   pe_minvf AS p
            WHERE  (p.pminf_member = 4380) AND 
                   p.pminf_date <= '03/30/2011'
           )
       )
  AND (pminf_fund = 'LIFESTYLE')

答案 2 :(得分:0)

查询:

SELECT MAX(pminf_date) AS Expr
FROM   pe_minvf AS pe_minvf_1
WHERE  (pminf_member = 4380)
;

返回'01/01/2011'或其他什么?

也许你想要在子查询中使用与在主查询中相同的条件:

SELECT MAX(pminf_date) AS Expr
FROM   pe_minvf AS pe_minvf_1
WHERE  (pminf_member = 4380)
  AND  (pminf_schmem = 'M')

答案 3 :(得分:0)

使用子查询来限制返回的行而不是where子句。使用它作为子查询:

(SELECT MAX(pminf_date) AS Expr1             
FROM   pe_minvf AS pe_minvf_1             
WHERE  (pminf_member = 4380) 

保持查询基本相同......

Select same_fields_as you_did_before
from pe_minvf
inner join 
 (SELECT MAX(pminf_date) AS Maxdate, tablekey             
 FROM   pe_minvf AS pe_minvf_1             
 WHERE  pminf_member = 4380) a on a.tablekey = pe_minvf.table_key
where same_where_clause_you_had

有意义吗?我不确定你的table_key在pe_minvf上是什么......你必须自己插入。我发现使用subqueires和内部连接是一种更有效的方法来限制行,然后在where子句中有子查询

答案 4 :(得分:0)

第十二! 感谢正确的语法...我用它来解决我的类似问题de-jur(当天) 除非我错了,我在下面会有什么工作..如果不是,我会在这里解决它... 在下面的示例中,数据字段名称已被清除,但语法工作非常快。 顺便说一下,有20,480个不同的device_id

declare 
 @BegDate varchar(20)=(select cast(CONVERT(VARCHAR(20), getdate()-2,101) as varchar(20)) + ' 10:59:59 PM')
,@EndDate varchar(20)=(select cast(CONVERT(VARCHAR(20), getdate()-0,101) as varchar(20)) + ' 11:00:00 PM')
  select f1.ABC_ConfigProcStatusID,f1.DeviceID,f1.DBfilename ,f1.LastUpdatedDate
    from dbo.ABC_ConfigProcStatus f1
        inner join
          (select distinct DeviceID,max(LastUpdatedDate) as max_DeviceIDdte
            from dbo.ABC_ConfigProcStatus 
            where [Status]=2  
            and DeviceID not in(select ExclusionDeviceIDs from ABC_ConfigDeviceIDExclusionList)
            group by DeviceID) f2 
        on f2.max_DeviceIDdte = f1.LastUpdatedDate
   where [Status]=2  
   and f2.DeviceID = f1.DeviceID
   and f1.DeviceID not in(select ExclusionDeviceIDs from ABC_ConfigDeviceIDExclusionList)
   and LastUpdatedDate between @BegDate and @EndDate
   and left(upper(f1.DeviceID),3) in ('XYZ','ZKO')
   order by f1.LastUpdatedDate