查询以获取每条记录的最短日期

问题描述:

我想获得我的表中每条记录的最短日期,其中有一个主键的多条日期条目。看看我的表:查询以获取每条记录的最短日期

CaseNo  Entry_date 
    ABC-001  2/12/13 
    ABC-002  2/09/13 
    ABC-001  1/01/13 
    ABC-001  1/31/13 
    ABC-002  1/01/13 
    ABC-003  2/01/12 
    ABC-003  2/18/13 

我想有这样的结果:

 CaseNo  Entry_date Min_date 
     ABC-001  2/12/13  1/01/13 
     ABC-002  2/09/13  1/09/13 
     ABC-001  1/01/13  1/01/13 
     ABC-001  1/31/13  1/01/13 
     ABC-002  1/09/13  1/09/13 
     ABC-003  2/01/12  2/01/13 
     ABC-003  2/18/13  2/01/13 

我想记录在我的表中的每个CaseNo的最小日期。我想这样的代码:

Select 
    CaseNo,Entry_date, Min(Entry_date) as Min_date 
from mytable group by CaseNo 

结果是这样的:

CaseNo  Entry_date Min_date 
    ABC-001  1/01/13  1/01/13 
    ABC-002  1/09/13  1/09/13 
    ABC-003  2/01/12  2/01/13 

代码中删除不具有最小日期的行。我想要显示所有记录的最短日期为Min_date

+0

这是SQLServer的? ABC-002的最小值不应该是1/01/13?另外,为什么你在这个问题的标题中包含“(转贴)”? – 2013-04-25 06:54:09

+0

是的我试图用over(由CaseNo分区),但是在关键字'over'附近有一个错误的语法错误。 – 2013-04-25 07:02:45

+0

Juan Filipe:你还没有回答我的任何问题(尽管Vinayak确实回答了其中一个问题)。我将重复最重要的一点:**这是SQLServer **,如果不是,那是哪种RDBMS?答案**将**影响如何解决这个问题。 – 2013-04-25 07:11:59

Select a.Case_No, 
     a.Entry_date, 
     Min(b.Entry_date) as Min_date 
from mytable a, 
     mytable b 
where a.case_no = b.case_no 
group by a.Case_No, a.entry_date 
order by a.entry_date 

http://sqlfiddle.com/#!2/fe6bd/2

您可以用CTE或子查询解决。 CTE有更好的表现。

子查询版本

SELECT 
    CaseNo, 
    Entry_date, 
    (SELECT MIN(Entry_date) FROM Cases subc WHERE subc.CaseNo=c.CaseNo GROUP BY CaseNo) AS MinEntryDate 
FROM Cases c; 

CTE版本

WITH CasesMinEntryDate(CaseNo, MinEntryDate) AS 
(
    SELECT CaseNo, MIN(Entry_date) FROM Cases GROUP BY CaseNo 
) 
SELECT 
    c.CaseNo, 
    Entry_date, 
    MinEntryDate 
FROM Cases c 
INNER JOIN CasesMinEntryDate cmed ON c.CaseNo=cmed.CaseNo; 

http://sqlfiddle.com/#!3/0feee/8