1

外部キー、日付、その他のフィールドを含むソース テーブルから最新の行セットを取得しようとしています。データのサンプル セットは次のようになります。

create table #tmp (primaryId int, foreignKeyId int, startDate datetime, 
                                                    otherfield varchar(50))

insert into #tmp values (1, 1, '1 jan 2010', 'test 1')
insert into #tmp values (2, 1, '1 jan 2011', 'test 2')
insert into #tmp values (3, 2, '1 jan 2013', 'test 3')
insert into #tmp values (4, 2, '1 jan 2012', 'test 4')

取得したいデータの形式は次のとおりです。

foreignKeyId maxStartDate            otherfield
------------ ----------------------- -------------------------------------------
1            2011-01-01 00:00:00.000 test 2
2            2013-01-01 00:00:00.000 test 3

foreignKeyIdつまり、最新の開始日と関連するその他のフィールドを表示するのは1 行だけです。これprimaryIdは無関係です。

私は思いついた:

select t.foreignKeyId, t.startDate, t.otherField from #tmp t
    inner join (
                  select foreignKeyId, max(startDate) as maxStartDate
                      from #tmp
                      group by foreignKeyId
               ) s
           on t.foreignKeyId = s.foreignKeyId and s.maxStartDate = t.startDate 

しかし、(a)これは内部クエリを使用しているため、パフォーマンスの問題が発生する可能性があると思われます。(b)元のテーブルの2つの行に同じforeignKeyIdとがある場合、行が繰り返されますstartDate

各外部キーと開始日の最初の一致のみを返すクエリはありますか?

4

2 に答える 2

1

再設計するのではなく、試行を修正したい場合は、

select t.foreignKeyId, t.startDate, t.otherField from #tmp t
inner join (
  select foreignKeyId, max(startDate) as maxStartDate, max(PrimaryId) as Latest
  from #tmp
  group by foreignKeyId
           ) s
on t.primaryId = s.latest

PrimaryIDが時間の経過とともに増加すると仮定すると、仕事をしたでしょう。

いくつかのインデックスを想定しているだけでなく、内部クエリに関する問題は解消されていたでしょう。

于 2013-09-24T21:52:19.850 に答える