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

Jua*_*ipe 0 sql vb.net greatest-n-per-group

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

   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
Run Code Online (Sandbox Code Playgroud)

我希望得到这样的结果:

       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
Run Code Online (Sandbox Code Playgroud)

我想得到我桌上记录的每个CaseNo的最小日期.

我试过这段代码:

Select CaseNo,Entry_date, Min(Entry_date) as Min_date
from mytable group by CaseNo
Run Code Online (Sandbox Code Playgroud)

结果如下:

   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
Run Code Online (Sandbox Code Playgroud)

代码删除没有最小日期的行.我想显示最小日期为Min_date的所有记录.

pil*_*row 8

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

加入派生表

创建(CaseNo,MIN(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;
Run Code Online (Sandbox Code Playgroud)

使用分析(窗口)函数

如果您的RDBMS支持的话,你可以跳过派生表,并要求与最低的纪录Entry_dateCaseNo系统提供的:

SELECT CaseNo, Entry_date, MIN(Entry_date) OVER (PARTITION BY CaseNo) AS "Min_date"
  FROM tbl;
Run Code Online (Sandbox Code Playgroud)

  • @Juan:我建议避免使用"它不起作用"这一短语 - 由于某种原因,它似乎不鼓励作者说出实际发生的事情(而且我经常因为缺乏努力而投票).如果你不解释,这里的pilcrow是什么意思?你收到错误了吗?你有结果吗?你得到了什么结果?您是否尝试过针对特定用例进行修改? (2认同)