如何通过多条记录中的每条记录获取最小日期

时间:2013-02-20 03:30:23

标签: vb.net greatest-n-per-group sql

我想获得表格中每条记录的最小日期,其中包含一个主键的多个日期条目。看看我的桌子:

   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的所有记录。

2 个答案:

答案 0 :(得分:8)

不确定您正在使用哪种RDBMS,但会想到两种方法。

加入派生表

创建(CaseNoMIN(Entry_date))行的派生表,并将其与主表连接:

    SELECT CaseNo, Entry_date, d.Min_date AS "Min_date"
      FROM tbl
INNER JOIN (  SELECT CaseNo, MIN(Entry_date) AS "Min_date"
                FROM tbl
            GROUP BY 1) d
        ON tbl.CaseNo = d.CaseNo;

使用分析(窗口)函数

如果您的RDBMS支持它,您可以跳过派生表并询问系统提供的最小Entry_dateCaseNo的记录:

SELECT CaseNo, Entry_date, MIN(Entry_date) OVER (PARTITION BY CaseNo) AS "Min_date"
  FROM tbl;

答案 1 :(得分:1)

试试这个

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