2013-04-09 92 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)