2012-09-12 57 views
0

我會盡力解釋這個我能做到的最好。Oracle SQL:選擇值列表的第一個日期

我有一個要求,我需要在第一個字母發送日期的情況下拉。

Case  | Letter_Sent_Date 
1234  | 05/29/2012 
1234  | 05/30/2012 
1234  | 06/01/2012 

我該如何構建一個oracle sql,其中'WHERE'條件下面會出現這種情況出現在報告中?

WHERE Letter_Sent_Date between '01JUN2012' and '30JUN2012' 

由於發送的第一個字母在6月份不,我不希望它出現在該報表上,當我運行5月份報告中才會出現。

+1

你想什麼出現在五月報告主場迎戰6月的報告?五月的第一封信和六月的一封信都沒有? –

回答

1

您可以在一個查詢中獲得第一個字母,然後在其上寫入一個位置以根據日期範圍進行過濾。

要獲取的情況和第一個字母..

select case_id, 
     letter_sent_date 
    from (
    select case_id, 
      letter_sent_date, 
      rank() over (partition by case_id order by letter_sent_date asc) rnk 
     from case_table 
     ) 
    where rnk = 1 

爲了得到僅在第一個字母是在您指定的日期發送的情況下..

select case_id, 
     letter_sent_date 
from (
    select case_id, 
      letter_sent_date, 
      rank() over (partition by case_id order by letter_sent_date asc) rnk 
     from case_table 
    ) 
where rnk = 1 
    and letter_sent_date between to_date('01-JUN-2012','DD-MON-YYYY) 
          and to_date('30-JUN-2012','DD-MON-YYYY') 
0

如果我瞭解你在找什麼:

 
select case, letter_sent_date {, and any other fields you want from the table} 
from table_name 
where letter_sent_date between '01-jun-2012' and '30-jun-2012' 

然後這會輸出

 
case | letter_date_sent 
1234 | 06/01/2012 

如果這不是你在找什麼,請說明你的要求:)

+0

感謝您的回覆!我所需要的僅僅是填充案例的第一個Letter_Date_Sent。因此,如果letter_date_sent在多個月內具有多個值,那麼我不希望此案例在隨後的幾個月內填充。當我們在'WHERE'語句中指定基於'letter_sent_date'的報告期時,問題就出現了。因爲它只查看該特定月份是否有'letter_date_sent'值,因此它將爲每個報告月份填充該案例。我希望只有在第一封信發出的月份纔會出現這種情況。謝謝! –

2

我會使用MIN窗/解析函數此:

select case_id, letter_sent_date 
from (select case_id, letter_sent_date, 
      min(letter_sent_date) over (partition by case_id) as mindate 
     from t 
    ) t 
where mindate between '01JUN2012' and '30JUN2012' 

這消除了所有的情況下,根據第一封信的發送時間。如果你只是想排除這一行,那麼AriStorm就回答了這個問題。

+0

+1。這比rank等其他分析函數更有意義。 –

+0

@RajeshChamarthi,'rank()'的問題和好處在於使用起來並不困難。不同的是,當你使用PK時,只有你知道你什麼時候有正確的答案。 – Ben

+0

正確。但在大多數情況下,您還需要選擇行中其餘的列。 (比如說你還需要在上面的例子中找到letter_subject和address)。在這種情況下,rank/row_number可能是選擇。 –

0

還是老派集團/ HAVING:

SELECT case_id, MIN(letter_sent_date) 
    FROM case_table 
    GROUP BY case_id 
HAVING MIN(letter_sent_date) BETWEEN '01-JUN-2012' and '30-JUN-2012' 
相關問題