2012-11-30 34 views
2

我有以下表如何获取每个外键的最短日期记录的记录ID?

recordID    createdDate       ForeignKeyID 
00QA000000PtFXaMAN  2012-01-03 13:23:36.000    001A000000ngM21IAE 
00QA000000OS2QiMAL  2011-12-15 12:03:02.000    001A000000ngM21IAE 
. 
. 
. 
. 

我想获得的recordId为foreignKeyID其中createdDAte是foreignKeyID

最小(createdDate)如果的recordId是身份的诠释我可以通过执行以下操作查询

Select min(recordId),ForeignkeyID 
from table 
group by ForeignKeyId 

我的渊源以为我可以创建以下查询临时表,然后在的minDate和foreignKeyID其连接到表,但后来我发现,有对foreig多个记录nKeyId具有相同的createdDate。

Select min(createdDate) as minDate,ForeignKeyID 
from table 
group by ForeignKeyId 

我打开使用临时表或子查询或任何真的。谢谢。

+0

这个问题已经在过去已经回答了很多次,因为代码急促别人多一个:http://stackoverflow.com/questions/tagged/most-n-group-group + sql-server –

+0

@BillKarwin感谢您指出这一点,我很难找出如何搜索问题。我尝试了几次,但没有拿出我需要的东西。 – atbebtg

回答

3

一个做到这一点的方法之一是

select A.ForeignKeyID, R.recordID 
from (select distinct t.ForeignKeyID from table as t) as A 
    outer apply 
    (
     select top 1 t.recordID 
     from table as t where t.ForeignKeyID = A.ForeignKeyID 
     order by t.createdDate asc 
    ) as R 

SQL FIDDLE EXAMPLE

另一种方式来做到这一点是

select top 1 with ties 
    t.recordID, t.ForeignKeyID 
from table as t 
order by row_number() over (partition by t.ForeignKeyID order by t.createdDate) 

SQL FIDDLE EXAMPLE

而另一种方式

select A.recordID, A.ForeignKeyID 
from 
(
    select 
     t.recordID, t.ForeignKeyID, 
     row_number() over (partition by t.ForeignKeyID order by t.createdDate) as RowNum 
    from table1 as t 
) as A 
where A.RowNum = 1 

SQL FIDDLE EXAMPLE

我喜欢第二比

+0

哇@roman非常感谢你。第一个工作很好,我会检查其他2。 – atbebtg

1
SELECT 
    recordID, createdDate, ForeignKeyID 
FROM 
    (SELECT 
     recordID, createdDate, ForeignKeyID, 
     ROW_NUMBER() OVER (PARTITION BY ForeignKeyID 
          ORDER BY createdDate, recordID 
         ) AS rn 
    FROM 
     tableX 
) AS t 
WHERE 
    rn = 1 ;