Как я могу отслеживать изменения нескольких столбцов в существующей таблице SQL Server, используя первичные ключи? - PullRequest
0 голосов
/ 23 октября 2018

В настоящее время я пытаюсь отслеживать изменения нескольких столбцов (назовем их col1 и col2) в таблице SQL Server.Таблица не обновляется / вставляется / удаляется с течением времени;новые записи только добавляются к нему (см. ниже 10/01 против 11/01).

Моей конечной целью было бы запустить SQL-запрос или хранимую процедуру, которая бы выделяла изменения сверхурочно, используя первичные ключи в соответствии с каркасом:

PrimaryKey | ColumnName | BeforeValue | AfterValue | Date

например,

Оригиналтаблица:

+-------+--------+--------+--------+
|  PK1  |  Col1  |  Col2  |  Date  |
+-------+--------+--------+--------+
|   1   |    a   |    e   |  10/01 |  
|   1   |    b   |    e   |  11/01 |
|   2   |    c   |    e   |  10/01 |
|   2   |    d   |    f   |  11/01 |
+-------+--------+--------+--------+

Вывод:

+--------------+--------------+---------------+--------------+--------+
|  PrimaryKey  |  ColumnName  |  BeforeValue  |  AfterValue  |  Date  |
+--------------+--------------+---------------+--------------+--------+
|      1       |     Col1     |       a       |       b      |  11/01 |
|      2       |     Col1     |       c       |       d      |  11/01 |
|      2       |     Col2     |       e       |       f      |  11/01 |
+--------------+--------------+---------------+--------------+--------+  

Пожалуйста, дайте мне знать, если у вас есть какие-либо подсказки, ссылки или вам нужна дополнительная информация, это было бы очень полезно!

1 Ответ

0 голосов
/ 23 октября 2018

Вот код, который немного неуклюжий, но, кажется, работает, в основном для каждой строки я пытаюсь найти более раннюю строку с другим значением.Это делается дважды, один раз для Col1 и один раз для Col2.

Чтобы это работало, мне пришлось добавить уникальное поле PK, которое я не знаю, есть ли у вас или нет, вы можете легко добавить какукажите поле, либо к вашей реальной таблице, либо к таблице, используемой для расчетов.

declare @TestTable table (PK int, PK1 int, Col1 varchar(1), Col2 varchar(1), [Date] date)

insert into @TestTable (PK, PK1, Col1, Col2, [Date])
  select 1, 1, 'a', 'e', '10 Jan 2018'
  union all select 2, 1, 'b', 'e', '11 Jan 2018'
  union all select 3, 2, 'c', 'e', '10 Jan 2018'
  union all select 4, 2, 'd', 'f', '11 Jan 2018'

  select T1.[Date], T1.PK1, 'Col1', T2.Col1, T1.Col1
  from @TestTable T1
  inner join @TestTable T2 on T2.PK = (
      select top 1 PK
      from @TestTable T21
      where T21.PK1 = T1.PK1 and T21.Col1 != T1.Col1 and T21.[Date] < T1.[Date]
      order by T21.[Date] desc
    )

  union all

  select T1.[Date], T1.PK1, 'Col2', T3.Col2, T1.Col2
  from @TestTable T1
  inner join @TestTable T3 on T3.PK = (
      select top 1 PK
      from @TestTable T31
      where T31.PK1 = T1.PK1 and T31.Col2 != T1.Col2 and T31.[Date] < T1.[Date]
      order by T31.[Date] desc
    )

  order by [Date], PK1
...