使用不同表的多个 id 的最大日期

Posted

技术标签:

【中文标题】使用不同表的多个 id 的最大日期【英文标题】:max date for multiple id using different tables 【发布时间】:2018-08-08 08:04:24 【问题描述】:

我有 3 个表(SQL Server 2008 R2):

表 1

ID  Date  
123 20-08-2011  
123 20-08-2011  
234 30-09-2012

表 2

ID  Centre  ChangeDate      
123 987     16-08-11    
123 568     28-05-10
234 456     14-09-12

表 3

Centre  Centre_Name 
987     test1
568     test2
456     test3

我想做一个连接所有列的查询,并且只选择具有最大 ChangeDate 的中心。因此,应返回下表:

ID      Date        Centre      ChangeDate  Centre_Name     
123     20-08-11    987         16-08-11    test1
123     20-08-11    987         16-08-11    test1
234     30-09-12    456         14-09-12    test3

谢谢。

【问题讨论】:

【参考方案1】:

应该有多种方法可以实现您的结果。一种方法是使用由 [Id] 列(或 [Id] 和 [Centre] 如果您想要具有最高 [ChangeDate] 的 Id/Centre 组合)分区的 row_number()。这将产生独特的结果,并且不符合您的答案中描述的您想要的结果(我的问题是:您为什么想要重复的答案?)。另一种方法是使用子查询从每个 Id 的表 2 中检索最大更改数据,然后第二次将该结果加入表 2。

declare @table1 table ([Id] INT, [Date] date)
declare @table2 table ([Id] INT, [Centre] int, [ChangeDate] date)
declare @table3 table ([Centre] int, [Centre_Name] varchar(25))

insert into @table1 values (123,'2011-08-20'),(123,'2011-08-20'),(234,'2012-09-30')
insert into @table2 values (123,987,'2011-08-16'),(123,568,'2010-05-28'),(234,456,'2012-09-14')
insert into @table3 values (987,'test1'),(568,'test2'),(456,'test3')

方法一:使用row_number()

select *
from (
 select t1.[Id],t1.[Date],t2.[Centre],t2.[ChangeDate],t3.[Centre_Name]
 , rn=row_number() over (partition by t2.[Id]/*, t2.[Centre]*/ order by t2.[ChangeDate] desc)
 from   @table1 t1
 join   @table2 t2 on t2.Id = t1.Id 
 join   @table3 t3 on t3.Centre=t2.Centre
) x where x.rn=1

方法 2:使用子查询检索每个 [Id] 的最大 [ChangeDate]

select  t1.[Id],t1.[Date],t2.[Centre],t2.[ChangeDate],t3.[Centre_Name]
from    @table1 t1
join    (select Id, maxChangeDate=max(ChangeDate) from @table2 group by Id ) t2_maxChangeDate on t1.[Id]=t2_maxChangeDate.[Id]
join    @table2 t2 on t2.[Id]=t2_maxChangeDate.[Id] and t2.[ChangeDate]=t2_maxChangeDate.[maxChangeDate]
join    @table3 t3 on t3.[Centre] = t2.[Centre]

【讨论】:

【参考方案2】:

我会使用apply

select t1.*, tt.*
from table1 t1 cross apply
    ( select top (1) t2.Centre, t2.ChangeDate, t3.Centre_Name   
      from table2 t2 inner join
           table3 t3
           on t3.Centre = t2.Centre
      where t2.id = t1.id
      order by t2.ChangeDate desc
    ) tt;

【讨论】:

以上是关于使用不同表的多个 id 的最大日期的主要内容,如果未能解决你的问题,请参考以下文章

如何设置子查询以获取具有最新日期和最大 ID 的单个记录?

检索表中不同 ID 的最大日期 [重复]

从多个表返回最大日期加入oracle

用于创建具有数据框中每个日期的最小值和最大值的表的函数

在记录的可用日期中找出最大的日期,然后将输出映射到其他类似的输出以找到所有日期中最大的

SQL Group By 每个日期的总和并使用最大日期