2017-10-10 18 views
0

このコードを書く方法については、アドバイスをお探しください。SQL Server:最後の5つの日付を格納する

私は、あるシステムから別のシステムに移植されたユニークな値のテーブルを持っています。そして、私は、レコードが持ち出された最後の5つの日付を記録したいと思います。

たとえば、2017年10月1日にアイテムAがシステムXからシステムYにリフレッシュされたので、この日付をテーブルに保存します。それから、翌月にはさらに4回以上持ち込まれるので、これらの日付値もそのテーブルに書きたいと思います。

最後の5つの日付が書かれているので、新しい日付がテーブルデータを上書きするようにコードを管理する必要があります。この表

例データ。 日付列は、各プロパティ行に対して最後に発生した5件の更新を表します。

Property ID's, Date 1, Date 2, Date 3, Date 4, Date 5 
1    01/07/17, 01/08/17 01/10/17 05/10/17 10/10/17 
2    01/01/17 01/03/17 01/06/17 05/10/17 10/10/17 
3    01/02/17 05/02/17 01/10/17 05/10/17 10/10/17 
4    01/03/17 01/08/17 01/10/17 

プロパティ4にシステムXからの更新がある場合は、日付4が入力されます。 プロパティ3にシステムxからの更新がある場合、日付2〜5は1つ左に移動し、日付5には最新の日付が入力されます。

これは最新の5つのアップデートを記録する最良の方法でしょうか?

また、各プロパティIDと更新日をテーブルに書き込んで、プロパティごとに5つのエントリしか保持しない何らかの種類のクリーニングルーチンを作成することもできます。

私は漠然としている場合はお詫び申し上げます。

+1

合計で5レコード、またはグループに5レコードのみ? System X、Yの5つのレコードを考えてみましょう。システムX、Zの5レコード。 A、Bなどの5レコード?とにかくここで質問をする良い方法は、サンプルデータと期待される結果を提供することです。 –

答えて

0

より良い使用テーブル。

CREATE VIEW dbo.Top5ChangeDates 
AS 
WITH cte AS (
    SELECT PropertyID, 
      DateChanged, 
      ROW_NUMBER() OVER (PARTITION BY PropertyID ORDER BY DateChanged DESC) as rn 
    FROM dbo.ChangeDates 
) 

SELECT PropertyID, 
     DateChanged 
FROM cte 
WHERE rn <= 5 
GO 

または、ビューの代わりにTRIGGERを挿入してデータをクリアしてから使用してください。

+0

良い提案。私は物事を複雑にしていたと思う –

0

最新の5つのレコードを保存する場合は、MERGEのように見えますが、同時にINSERTDELETEの動作が可能です。

は、このスクリプトは、ID値ごとに最新の5行を保持MERGEを示しています

うまくいけば
create table #History (ID int not null, OccurredAt datetime2(7) not null) 
go 
declare @current table (ID int not null) 
insert into @current (ID) values (1),(3) 

;With Keeps as (
    select 
     *,ROW_NUMBER() OVER (PARTITION BY ID ORDER BY OccurredAt desc) as rn 
    from #History 
    where ID in (select ID from @current) 
) 
merge into #History t 
using (select ID,SYSDATETIME() from @current 
     union all 
     select ID,OccurredAt from Keeps where rn between 1 and 4) s(ID,OccurredAt) 
on 
    t.ID = s.ID and 
    t.OccurredAt = s.OccurredAt 
when not matched then insert (ID,OccurredAt) values (s.ID,s.OccurredAt) 
when not matched by source and t.ID in (select ID from @current) then delete; 

waitfor delay '00:00:01' 
go 30 
select * from #History 

CTEが保存されるべき「その他」の行とどのように2つのnot matched句を見つけるどのようにあなたが見ることができますINSERTDELETEのアクティビティを処理します。

CREATE TABLE dbo.ChangeDates (
    PropertyID int, 
    DateChanged date 
) 

そして、ちょうどそれにデータを書き込む:のような

+0

CTEの面で良い提案です。それを読むだろう。 –

関連する問題