如何获取每个外键的最短日期记录的记录 ID?

Posted

技术标签:

【中文标题】如何获取每个外键的最短日期记录的记录 ID?【英文标题】:How do I get the record ID of the record with the min date for each foreign key? 【发布时间】:2012-11-19 02:57:11 【问题描述】:

我有下表

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

我正在尝试获取 foreignKeyID 的 recordID,其中 createdDAte 是 foreignKeyID 的 min(createdDate)

如果 recordID 是 identity int 我可以通过以下查询得到它

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

我原本以为我可以使用以下查询创建临时表,然后将其加入到 minDate 和 foreignKeyID 上的表中,但后来我发现 foreignKeyId 的多条记录具有完全相同的 createdDate。

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

我愿意使用临时表或子查询或其他任何东西。谢谢。

【问题讨论】:

这个问题过去已经回答过很多次了:***.com/questions/tagged/… @BillKarwin 感谢您指出这一点,我很难弄清楚如何搜索问题。我尝试了一些,但没有找到我需要的东西。 【参考方案1】:

其中一种方法是

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

由于代码短,我比其他人更喜欢第二个

【讨论】:

哇@roman 非常感谢你。第一个效果很好,我会检查其他 2 个。【参考方案2】:
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 ;

【讨论】:

这对我很有帮助。谢谢

以上是关于如何获取每个外键的最短日期记录的记录 ID?的主要内容,如果未能解决你的问题,请参考以下文章

Django Queryset - 获取每个外键的最新记录

每个类别的帖子限制 10 条记录[重复]

如何从一个表中选择另一个表中没有外键的记录

如何删除有外键的mysql记录

如何在 phpmyadmin 中显示外键的内容

如何获取公司未在 Sql 中记录的每个公司的日期?