2017-05-02 5 views
2

SQL Server 2016があります。長年にわたり、独自の履歴があります。今では、履歴データを新しい形式に変換し、CustomAuditテーブルを履歴テーブルとして使用して、使用可能な履歴データを使用したいとします。初めのためにSQL Server:履歴データを一時テーブルに変換する

は、質問

CREATE TABLE [dbo].[client] 
(
    idclient int identity(1,1) primary key, 
    clientData nvarchar (400) 
) ON [PRIMARY] 

INSERT [dbo].[client] (clientData) values ('some-12221') 
INSERT [dbo].[client] (clientData) values ('some-22111') 

alter table [client] 
add 
    StartTime datetime2 GENERATED ALWAYS AS ROW START DEFAULT GETUTCDATE(), 
    EndTime datetime2 GENERATED ALWAYS AS ROW END DEFAULT CONVERT(DATETIME2, '9999-12-31 23:59:59.9999999'), 
    PERIOD FOR SYSTEM_TIME (StartTime,EndTime) 

CREATE TABLE [dbo].[CustomAydit_client] 
(
    idclient int, 
    dEditDate datetime NOT NULL DEFAULT (getdate()), 
    clientData nvarchar (400) 
) ON [PRIMARY] 

alter table [CustomAydit_client] 
add 
    StartTime datetime2 GENERATED ALWAYS AS ROW START DEFAULT GETUTCDATE(), 
    EndTime datetime2 GENERATED ALWAYS AS ROW END DEFAULT CONVERT(DATETIME2, '9999-12-31 23:59:59.9999999'), 
    PERIOD FOR SYSTEM_TIME (StartTime,EndTime) 

INSERT [dbo].[CustomAydit_client] (idclient, dEditDate, clientData) 
VALUES (1, (CAST(N'2016-05-06 10:08:11.923' AS DateTime)), 'some-1') 

INSERT [dbo].[CustomAydit_client] (idclient, dEditDate, clientData) 
VALUES (1, (CAST(N'2016-02-11 10:08:11.923' AS DateTime)), 'some-211') 

INSERT [dbo].[CustomAydit_client] (idclient, dEditDate, clientData) 
VALUES (2, (CAST(N'2016-12-06 10:08:11.923' AS DateTime)), 'some-1') 

INSERT [dbo].[CustomAydit_client] (idclient, dEditDate, clientData) 
VALUES (1, (CAST(N'2015-05-19 10:08:11.923' AS DateTime)), 'some-1') 

INSERT [dbo].[CustomAydit_client] (idclient, dEditDate, clientData) 
VALUES (2, (CAST(N'2016-05-06 10:08:11.923' AS DateTime)), 'some-211') 

INSERT [dbo].[CustomAydit_client] (idclient, dEditDate, clientData) 
VALUES (1, (CAST(N'2016-05-26 10:08:11.923' AS DateTime)), 'some-1') 

INSERT [dbo].[CustomAydit_client] (idclient, dEditDate, clientData) 
VALUES (2, (CAST(N'2016-05-06 10:08:11.923' AS DateTime)), 'some33-1') 

INSERT [dbo].[CustomAydit_client] (idclient, dEditDate, clientData) 
VALUES (1, (CAST(N'2016-05-06 10:08:11.923' AS DateTime)), 'some3-1') 

INSERT [dbo].[CustomAydit_client] (idclient, dEditDate,clientData) 
VALUES (2, (CAST(N'2016-11-16 10:08:11.923' AS DateTime)), 'some-1') 

INSERT [dbo].[CustomAydit_client] (idclient, dEditDate, clientData) 
VALUES (1, (CAST(N'2016-02-17 10:08:11.923' AS DateTime)), 'some-1') 

は、私は、行のため、行のためのStartTimeを必要とし、小さな例があるでしょう。

は、顧客1については、私は、クライアントは、このOK 9999から12終了時間を持つべきではない行にフィールドDeditDate

更新このデータ行1つのフィールドの終了時間

そして、最後の行の2つのデータを取りたいです-31 23:59:59.9999999

SELECT 
    ROW_NUMBER() OVER(PARTITION BY idclient ORDER BY dEditDate) AS tempid, 
    idclient, 
    dEditDate, 
    StartTime, EndTime 
FROM 
    [dbo].[CustomAydit_client] 
ORDER BY 
    idclient, dEditDate 
+2

あなたはテーブル定義とサンプルデータを投稿してくれました。しかし、あなたが出力として望むものは私にはあまり明確ではありません。 –

+0

StartTimeとEndTimeが必要な行の一時テーブル。私はEndTimeを正しく行う方法はありません。私のデータを使用 – GoAnatol

+0

私はそのようなsomesingが必要ですhttps://1drv.ms/i/s!ApEvwFL7i3nmkvlgTivat9If6J_vdQ – GoAnatol

答えて

1

あなたは、終了時刻として次の行から値を取得するlead機能を使用することができます。

select 
    ROW_NUMBER() OVER(PARTITION BY idclient ORDER BY dEditDate) AS tempid, 
    idclient, 
    dEditDate, 
    StartTime, 
    lead(dEditDate) over(PARTITION BY idclient ORDER BY dEditDate) as EndTime 
from [dbo].[CustomAydit_client] 
order by idclient, dEditDate 
+0

多くの行(100 mio以上)の場合に 'lead'のパフォーマンスに関する経験はありますか? –

+0

ありがとうございました。たくさんお手伝いします。 – GoAnatol

+0

@GoAnatol、あなたはあなたの質問に対する答えを得ましたか?私はまったく同じものが必要です – Dan

関連する問題