2013-04-09 93 views
0

我试图做的非常简单的查询。SQL选择带有最大日期和最大最大日期的收费代码语句

我试图选择具有两个日期的收费代码:

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年2月1日2013年2月1日

38073 2013年2月1日2013年2月1日

+1

根据你的语法似乎你使用SQL Server。如果这个权利? – 2013-04-09 18:11:46

+0

假设SQL服务器,你需要'外部应用'而不是'LEFT JOIN' ... – a1ex07 2013-04-09 18:13:05

+0

@PM 77-1是SQL Server – 2013-04-09 18:16:54

回答

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 
+0

哇,这工作太棒了!谢谢你的帮助! – 2013-04-09 18:59:31

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用这个演示。

+0

感谢您的帮助! 但是,我得到: Msg 156,Level 15,State 1,Line 10关键字'OUTER'附近的语法错误。 Msg 156,Level 15,State 1,Line 15关键字'ORDER'附近的语法错误。 – 2013-04-09 18:31:08

+0

@ user2224697您是否有机会使用SQL Server 2000? – Lamak 2013-04-09 18:35:32

+0

SQL Server 2008.对不起,我应该澄清。 – 2013-04-09 18:38:57

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)