私は、186 列、257899 行の大きな SQL テーブルを扱っています。メインデータで何かが変更されるたびに追加されます。これはshadow
、さまざまなフィールドに何が起こったかの監査履歴を確認できるテーブルの一部です。
私がする必要があるのは、誰が更新したか、いつ更新したか、特定の更新順序を確認することです。特定の3人のユーザーがメインテーブルを更新してから移動するたびに見つける必要があります
- 請求書 => アクティブ
- 請求 => 請求なし
- アクティブ => 進行中
私が集める必要があるのは、
- のステータスと切り替え先 (上記のリストから)
- 以下の 3 人のユーザーのリストから更新を行っているユーザーの名前
- 更新日時
- 請求番号
私が探しているユーザーの名前をあげることはできないので、次のようにします。
- ユーザー1
- ユーザー2
- ユーザー3
私は最近、SQL でセットベースの方法で物事を行うことについて学びましたが、これを理解するには十分ではありません。テーブルをループして個々のユーザーによる更新を見つけ、それらの更新をループして上記の基準を満たすものがあるかどうかを確認できることはわかっていますが、セットベースの承認に比べて遅いことはわかっています。
私はこれに取り組み始めたばかりなので、まだコードはありませんが、さまざまなことを試みるたびにこの質問を更新します。
セットベースの問題にする方法を理解する方法がわかりませんか?
アップデート
サンプル データは次のようになります。
#TestingData
データ テーブルと#TestingTable
シャドウ テーブルとして作成し、サンプル データを入力します。
create table #TestingTable(Id int,SMState varchar(50),UpdatedBy varchar(50),UpdatedOn datetime,cd_ClaimNumber varchar(50))
create table #TestingData(Id int,SMState varchar(50),UpdatedBy varchar(50),UpdatedOn datetime,cd_ClaimNumber varchar(50))
insert into #TestingData([Id],[UpdatedBy],[UpdatedOn],[cd_ClaimNumber],SMState)
Values (1,'John Doe','2015-10-25 12:00:00',208692,'Bill'),
(2,'John Doe','2015-10-25 12:00:00',297983,'Bill'),
(3,'John Doe','2015-10-25 13:00:00',697920,'Bill'),
(4,'John Doe','2015-10-25 12:00:00',992196,'Bill')
INSERT INTO #TestingTable([Id],[UpdatedBy],[UpdatedOn],[cd_ClaimNumber],SMState)
VALUES
(1,'John Jones','2015-10-24 13:00:00',208692,'No Bill'),
(2,'John Jones','2015-10-24 12:00:00',208692,'Bill'),
(3,'John Jones','2015-10-23 12:00:00',208692,'In Progress'),
(4,'John Jones','2015-10-22 16:00:00',208692,'Active'),
(5,'John Jones','2015-10-22 14:00:00',208692,'No Bill'),
(6,'John Jones','2015-10-22 12:00:00',208692,'Bill'),
(7,'John Jones','2015-10-24 12:00:00',297983,'Bill'),
(8,'John Jones','2015-10-23 14:00:00',297983,'Active'),
(9,'John Jones','2015-10-23 13:00:00',297983,'In Progress'),
(10,'John Jones','2015-10-23 12:00:00',297983,'Active'),
(11,'John Jones','2015-10-22 12:00:00',297983,'Bill'),
(12,'Jeffery Sampson','2015-10-24 13:00:00',697920,'No Bill'),
(13,'Jeffery Sampson','2015-10-24 12:00:00',697920,'Bill'),
(14,'Jeffery Sampson','2015-10-23 12:00:00',697920,'In Progress'),
(15,'Jeffery Sampson','2015-10-22 16:00:00',697920,'Active'),
(16,'Jeffery Sampson','2015-10-22 14:00:00',697920,'No Bill'),
(17,'Jeffery Sampson','2015-10-22 12:00:00',697920,'Bill'),
(18,'Jeffery Sampson','2015-10-24 12:00:00',992196,'Bill'),
(19,'Jeffery Sampson','2015-10-23 14:00:00',992196,'Active'),
(20,'Jeffery Sampson','2015-10-23 13:00:00',992196,'In Progress'),
(21,'Jeffery Sampson','2015-10-23 12:00:00',992196,'Active'),
(22,'Jeffery Sampson','2015-10-22 12:00:00',992196,'Bill')
上記のデータを使用したシャドウ テーブルは次のようになります。
+----+-------------+-----------------+---------------------+----------------+
| Id | SMState | UpdatedBy | UpdatedOn | cd_ClaimNumber |
+----+-------------+-----------------+---------------------+----------------+
| 1 | No Bill | John Jones | 24.10.2015 13:00:00 | 208692 |
| 2 | Bill | John Jones | 24.10.2015 12:00:00 | 208692 |
| 3 | In Progress | John Jones | 23.10.2015 12:00:00 | 208692 |
| 4 | Active | John Jones | 22.10.2015 16:00:00 | 208692 |
| 5 | No Bill | John Jones | 22.10.2015 14:00:00 | 208692 |
| 6 | Bill | John Jones | 22.10.2015 12:00:00 | 208692 |
| 7 | Bill | John Jones | 24.10.2015 12:00:00 | 297983 |
| 8 | Active | John Jones | 23.10.2015 14:00:00 | 297983 |
| 9 | In Progress | John Jones | 23.10.2015 13:00:00 | 297983 |
| 10 | Active | John Jones | 23.10.2015 12:00:00 | 297983 |
| 11 | Bill | John Jones | 22.10.2015 12:00:00 | 297983 |
| 12 | No Bill | Jeffery Sampson | 24.10.2015 13:00:00 | 697920 |
| 13 | Bill | Jeffery Sampson | 24.10.2015 12:00:00 | 697920 |
| 14 | In Progress | Jeffery Sampson | 23.10.2015 12:00:00 | 697920 |
| 15 | Active | Jeffery Sampson | 22.10.2015 16:00:00 | 697920 |
| 16 | No Bill | Jeffery Sampson | 22.10.2015 14:00:00 | 697920 |
| 17 | Bill | Jeffery Sampson | 22.10.2015 12:00:00 | 697920 |
| 18 | Bill | Jeffery Sampson | 24.10.2015 12:00:00 | 992196 |
| 19 | Active | Jeffery Sampson | 23.10.2015 14:00:00 | 992196 |
| 20 | In Progress | Jeffery Sampson | 23.10.2015 13:00:00 | 992196 |
| 21 | Active | Jeffery Sampson | 23.10.2015 12:00:00 | 992196 |
| 22 | Bill | Jeffery Sampson | 22.10.2015 12:00:00 | 992196 |
+----+-------------+-----------------+---------------------+----------------+
上記のデータを使用したデータ テーブルは次のようになります。
+----+---------+-----------+---------------------+----------------+
| Id | SMState | UpdatedBy | UpdatedOn | cd_ClaimNumber |
+----+---------+-----------+---------------------+----------------+
| 1 | Bill | John Doe | 25.10.2015 12:00:00 | 208692 |
| 2 | Bill | John Doe | 25.10.2015 12:00:00 | 297983 |
| 3 | Bill | John Doe | 25.10.2015 13:00:00 | 697920 |
| 4 | Bill | John Doe | 25.10.2015 12:00:00 | 992196 |
+----+---------+-----------+---------------------+----------------+
私が探している最終結果は次のようなものです。
+---------------+-----------+-----------------+---------------------+-------------+
| CurrentStatus | OldStatus | UpdatedBy | UpdateOn | ClaimNumber |
+---------------+-----------+-----------------+---------------------+-------------+
| No Bill | Bill | John Jones | 22.10.2015 14:00:00 | 208692 |
| In Progress | Active | John Jones | 23.10.2015 12:00:00 | 208692 |
| No Bill | Bill | John Jones | 24.10.2015 13:00:00 | 208692 |
| Active | Bill | John Jones | 23.10.2015 12:00:00 | 297983 |
| In Progress | Active | John Jones | 23.10.2015 13:00:00 | 297983 |
| No Bill | Bill | Jeffery Sampson | 22.10.2015 14:00:00 | 697920 |
| In Progress | Active | Jeffery Sampson | 23.10.2015 12:00:00 | 697920 |
| No Bill | Bill | Jeffery Sampson | 24.10.2015 13:00:00 | 697920 |
| Active | Bill | Jeffery Sampson | 23.10.2015 12:00:00 | 992196 |
| In Progress | Active | Jeffery Sampson | 23.10.2015 13:00:00 | 992196 |
+---------------+-----------+-----------------+---------------------+-------------+
これが私が試したことです:
with Test_1 as
( select ROW_NUMBER() over(order by pdr.cd_ClaimNumber,pdr.UpdatedOn) as RowID,* from #TestingTable pdr)
select t1.cd_ClaimNumber,t1.UpdatedOn, t1.SMState OldStatus, t2.SMState NewStatus, t1.UpdatedBy
from Test_1 t1
join Test_1 t2 on t2.RowID = t1.RowID + 1
where t1.cd_ClaimNumber = t2.cd_ClaimNumber
and t1.SMState != t2.SMState
order by t1.cd_ClaimNumber,t2.UpdatedOn
これにより、次の結果が得られます。
+----------------+---------------------+-------------+-------------+-----------------+
| cd_ClaimNumber | UpdatedOn | OldStatus | NewStatus | UpdatedBy |
+----------------+---------------------+-------------+-------------+-----------------+
| 208692 | 22.10.2015 12:00:00 | Bill | No Bill | John Jones |
| 208692 | 22.10.2015 14:00:00 | No Bill | Active | John Jones |
| 208692 | 22.10.2015 16:00:00 | Active | In Progress | John Jones |
| 208692 | 23.10.2015 12:00:00 | In Progress | Bill | John Jones |
| 208692 | 24.10.2015 12:00:00 | Bill | No Bill | John Jones |
| 297983 | 22.10.2015 12:00:00 | Bill | Active | John Jones |
| 297983 | 23.10.2015 12:00:00 | Active | In Progress | John Jones |
| 297983 | 23.10.2015 13:00:00 | In Progress | Active | John Jones |
| 297983 | 23.10.2015 14:00:00 | Active | Bill | John Jones |
| 697920 | 22.10.2015 12:00:00 | Bill | No Bill | Jeffery Sampson |
| 697920 | 22.10.2015 14:00:00 | No Bill | Active | Jeffery Sampson |
| 697920 | 22.10.2015 16:00:00 | Active | In Progress | Jeffery Sampson |
| 697920 | 23.10.2015 12:00:00 | In Progress | Bill | Jeffery Sampson |
| 697920 | 24.10.2015 12:00:00 | Bill | No Bill | Jeffery Sampson |
| 992196 | 22.10.2015 12:00:00 | Bill | Active | Jeffery Sampson |
| 992196 | 23.10.2015 12:00:00 | Active | In Progress | Jeffery Sampson |
| 992196 | 23.10.2015 13:00:00 | In Progress | Active | Jeffery Sampson |
| 992196 | 23.10.2015 14:00:00 | Active | Bill | Jeffery Sampson |
+----------------+---------------------+-------------+-------------+-----------------+
これはうまくいきません。私が探しているものだけでなく、すべての変更を取得します。これは、セットベースの方法でSQLをプログラミングすることに基づいています