SQL查询选择最小日期

时间:2014-12-11 11:01:28

标签: sql sql-server

我有一个名为transaction的SQL表,其中存储了不同类型的事务,例如付款安排,寄信等。 我运行了一个查询:

 SELECT TOP 6 Case_Ref as Case Ref,TrancRefNO as Tranc RefNO, Date_CCYYMMDD, LetterSent, Arr_Freq,
SMS_Sent_CCYYMMDD
    From Transaction
    Where  (LEN(LetterSent  ) >0 OR Arr_Freq >0)

表格看起来像这样

Case Ref  Tranc RefNO   Date_CCYYMMDD  LetterSent  Arr_Freq      SMS_Sent_CCYYMMDD
--------  -----------   ----------     ----------  ----------    -----------------
15001     100           20140425       Stage1                       
15001     101           20140430       Stage2                     
15001     102           20140510                   30              
15001     104           20140610                   30       
15002     105           20140425       Stage1    
15002     106           20140610                   30  

从表格中,我可以清楚地看到,案件15001在'20140430'上发了一封信,并且该人在'20140510'上开始安排。并且在'20140425'上发送了一封关于案件15001的信件,并且该人在'20140610'上作了安排。

我正在尝试使用C#创建一份excel报告,该报告将显示收到信件后收到安排的案件总数以及收到短信后的安排案件总数。

我试过了

select MAX(ROW_NUMBER() OVER(ORDER BY o3.Date_CCYYMMDD  ASC)), o3.
from
(
    select o.TrancRefNO, o.Date_CCYYMMDD  , sq.LetterSent  
    from Transaction o
    join Transaction sq on sq.TrancRefNO= o.TrancRefNO
    and sq.Date_CCYYMMDD  <= o.Date_CCYYMMDD  
    where o.Arr_Freq      >0
    and len(sq.LetterSent  ) > 0
) o2
join Transaction  o3 on o3.TrancRefNO= o2.TrancRefNO

但是给了我一个错误:

Msg 4109, Level 15, State 1, Line 2
Windowed functions cannot be used in the context of another windowed function or aggregate.

P.s Title将需要更改,因为我不知道该怎么称呼它。

3 个答案:

答案 0 :(得分:0)

SELECT * FROM table as t1
WHERE (LetterSent != '' OR SMS_SENT_CCYYMMDD != '')
AND (SELECT COUNT(*) FROM table AS t2
        WHERE t1.case_ref = t2.case_ref
        AND t1.DATE_CCYYMMDD < t2.DATE_CCYYMMDD
        AND Arr_freq > 0) > 1

我的假设基于我可以从你的帖子中收集到的内容:

  1. ARR_FREQ =&#39;!&#39;表示在指定日期安排了一段时间
  2. 由于没有显示NULL,我假设所有值都是&#39;&#39;。使用空值时,您将不得不使用合并命令
  3. 希望这会有所帮助。我在评论中不确定你的第二个问题(最长日期)。你需要再解释一下。

答案 1 :(得分:0)

SELECT * FROM table where Date = 
               (SELECT MIN(Date) from table)                   

答案 2 :(得分:0)

SELECT TOP 1 ROW_NUMBER() OVER(ORDER BY Date_CCYYMMDD ASC), mytable.*
FROM mytable

或只是

SELECT TOP 1 * FROM mytable
ORDER BY Date_CCYYMMDD ASC

但我想,你想要的不是整体的MIN日期,而是分组第一