具有最大日期和第二最大最大日期的SQL Select语句

时间:2013-04-09 18:03:18

标签: sql sql-server subquery max aggregate

我正在努力做的非常简单的查询。

我正在尝试选择两个日期的收费代码:

1)最近/ MAX生效日期和 2)表格中最近/ MAX日期之前的日期。

费用代码在表格中列出了多次,各种相应的生效日期。一些费用代码列出一次,只有一个生效日期,其他费用代码列出8次,有效期为8个。

这是我正在尝试做的事情:

select 
         BP.[mnemonic] [Charge Code]
        ,MAX (BP.[std_effective_date]) [Max date] 
        ,BP2.[Date Prior to Max]

from
    [TABLE1] BP
    left outer  join
    (select distinct [mnemonic], MAX ([std_effective_date]) [Max Date] 
         from 
         [TABLE1] 
    where [std_effective_date] < BP.[std_effective_date] group by [mnemonic]) BP2
    ON BP.[mnemonic] = BP2.[mnemonic]  

where    
         BP.[mnemonic] IN ('38066','38073','38080')
         group by BP.[mnemonic]

我知道我不能在连接中的子查询中引用外部查询中的表(即使它是同一个表)但是我该如何做类似的事情呢?或者你会如何建议获得第二个最大日期?

遗憾的是,表中没有行号。

请帮忙。 感谢。

样本结果

收费代码最长日期早于最高日期

38066 2013-02-01 2013-02-01

38073 2013-02-01 2013-02-01

3 个答案:

答案 0 :(得分:2)

SELECT t1.mnemonic
    , MAX(t1.std_effective_date) current
    , MAX(t2.std_effective_date) previous
FROM tbl1 t1
LEFT JOIN tb1 t2 ON t2.mnemonic = t1.mnemonic
                AND t2.std_effective_date < t1.std_effective_date
WHERE t1.mnemonic IN ('38066','38073','38080')
GROUP BY t1.mnemonic

答案 1 :(得分:0)

假设SQL Server(您的问题上的语法似乎正在使用它),您可以使用OUTER APPLY

SELECT  A.[mnemonic] [Charge Code], 
        A.[Max date], 
        B.[std_effective_date] [Date Prior to Max]
FROM (  SELECT  [mnemonic],
                MAX([std_effective_date]) [Max date] 
        FROM TABLE1
        GROUP BY [mnemonic]) A
OUTER APPLY (SELECT TOP 1 [std_effective_date]
             FROM TABLE1
             WHERE [mnemonic] = A.[mnemonic]
             AND [std_effective_date] < A.[Max date]
             ORDER BY [std_effective_date] DESC) B

Here is a sqlfiddle及其演示。

答案 2 :(得分:0)

试试这个

 Select b.mnemonic ChargeCode,
    b.std_effective_date Maxdate,
    b.DatePriortoMax
 from TABLE1 b
 Where std_effective_date =
     (Select Max(std_effective_date) From Table1
      Where mnemonic = b.mnemonic) 
  Or std_effective_date =
     (Select Max(std_effective_date) From Table1
      Where mnemonic = b.mnemonic
         And std_effective_date < b.std_effective_date)