0

我会尽力解释这一点。

我有一个要求,我需要输入案件的第一封信发送日期。

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 月份的报告时出现。

4

4 回答 4

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 会回答这个问题。

于 2012-09-12T20:03:39.760 回答
1

您可以在一个查询中获取第一个字母,然后在其上写一个 where 以根据日期范围进行过滤。

为了得到案例和第一个字母..

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')
于 2012-09-12T19:54:59.813 回答
0

如果我理解您在寻找什么:

选择大小写、letter_sent_date {,以及您想要从表中获取的任何其他字段}
从表名
其中 letter_sent_date 在 '01-jun-2012' 和 '30-jun-2012' 之间

这将输出

案例 | letter_date_sent
第1234章 2012 年 6 月 1 日

如果这不是您想要的,请澄清您的要求:)

于 2012-09-12T19:55:57.157 回答
0

或老派 GROUP/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'
于 2012-09-13T08:57:48.617 回答