查询以获取每条记录的最短日期
问题描述:
我想获得我的表中每条记录的最短日期,其中有一个主键的多条日期条目。看看我的表:查询以获取每条记录的最短日期
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
。
答
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
答
您可以用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;
这是SQLServer的? ABC-002的最小值不应该是1/01/13?另外,为什么你在这个问题的标题中包含“(转贴)”? – 2013-04-25 06:54:09
是的我试图用over(由CaseNo分区),但是在关键字'over'附近有一个错误的语法错误。 – 2013-04-25 07:02:45
Juan Filipe:你还没有回答我的任何问题(尽管Vinayak确实回答了其中一个问题)。我将重复最重要的一点:**这是SQLServer **,如果不是,那是哪种RDBMS?答案**将**影响如何解决这个问题。 – 2013-04-25 07:11:59