更改列值的历史记录<old value =“” - =“”new =“”value =“” - =“”date =“”>

时间:2018-06-14 19:27:34

标签: sql oracle pivot window-functions

有一个这样的表(“param”列不是4,但是,例如,10):

using (var driver = (IWebDriver) new ChromeDriver(Environment.CurrentDirectory))
{
    driver.Navigate().GoToUrl("http://localhost:5000");
    var btn = driver.FindElement(By.Id("btnHeaderLogin"));
    btn.Click();
}

它存储更改的完整历史记录。 也就是说,当存在一个单元的逻辑更新时 - 将一行插入表中 复制此logical_key上一行的所有值, 在这个新行中,只有正在更新的单元格的值才是新的。

有必要以这种形式显示更改参数的历史记录:

+-------------+-------------+---------------------+--------+--------+--------+--------+
| primary_key | logical_key |     change_time     | param1 | param2 | param3 | param4 |
+-------------+-------------+---------------------+--------+--------+--------+--------+
|           1 |           1 | 14.06.2018 22:00:00 | x      |      1 | f      |      3 |
|           2 |           1 | 14.06.2018 22:00:01 | y      |      4 | e      |     32 |
|           3 |           1 | 14.06.2018 22:00:02 | t      |     12 | r      |     32 |
|           4 |           1 | 14.06.2018 22:00:02 | t      |     45 | d      |     40 |
+-------------+-------------+---------------------+--------+--------+--------+--------+

我是这样实现的:

+------------+-----------+-----------+---------------------+
| param_name | old_value | new_value |     change_time     |
+------------+-----------+-----------+---------------------+
| param1     | null      | x         | 14.06.2018 22:00:00 |
| param2     | null      | 1         | 14.06.2018 22:00:00 |
| param3     | null      | f         | 14.06.2018 22:00:00 |
| param4     | null      | 3         | 14.06.2018 22:00:00 |
| param1     | x         | y         | 14.06.2018 22:00:01 |
| param2     | 1         | 4         | 14.06.2018 22:00:01 |
| param3     | f         | e         | 14.06.2018 22:00:01 |
| param4     | 3         | 32        | 14.06.2018 22:00:01 |
| param1     | y         | t         | 14.06.2018 22:00:02 |
| param2     | 4         | 12        | 14.06.2018 22:00:02 |
| param3     | e         | r         | 14.06.2018 22:00:02 |
| param2     | 12        | 45        | 14.06.2018 22:00:02 |
| param3     | r         | d         | 14.06.2018 22:00:02 |
| param4     | 32        | 40        | 14.06.2018 22:00:02 |
+------------+-----------+-----------+---------------------+

但这显然不是可以使用的东西。 我怎么能让它接受?

1 个答案:

答案 0 :(得分:0)

看看这是否有帮助 -

http://sqlfiddle.com/#!4/af100/29/0

CREATE TABLE Table1
    (primary_key int, logical_key int, change_time varchar2(19), param1 varchar2(1), param2 int, param3 varchar2(1), param4 int)
;

INSERT ALL 
    INTO Table1 (primary_key, logical_key, change_time, param1, param2, param3, param4)
         VALUES (1, 1, '14.06.2018 22:00:00', 'x', 1, 'f', 3)
    INTO Table1 (primary_key, logical_key, change_time, param1, param2, param3, param4)
         VALUES (2, 1, '14.06.2018 22:00:01', 'y', 4, 'e', 32)
    INTO Table1 (primary_key, logical_key, change_time, param1, param2, param3, param4)
         VALUES (3, 1, '14.06.2018 22:00:02', 't', 12, 'r', 32)
    INTO Table1 (primary_key, logical_key, change_time, param1, param2, param3, param4)
         VALUES (4, 1, '14.06.2018 22:00:02', 't', 45, 'd', 40)
SELECT * FROM dual
;

查询 -

select * from (
select col, lag(val,1,null) over (partition by col order by primary_key) as old_val,  val as new_val, change_time from Table1
unpivot (val for col in (PARAM1,PARAM3))
union
select col, to_char(old_val) as old_val, to_char(new_val) as new_val, change_time from (
select col, lag(val,1,null) over (partition by col order by primary_key) as old_val,  val as new_val, change_time from Table1
unpivot (val for col in (PARAM2,PARAM4))
  )) where nvl(old_val,-1) <> new_val
order by 4,1;

结果 -

COL     OLD_VAL NEW_VAL CHANGE_TIME
PARAM1  (null)  x   14.06.2018 22:00:00
PARAM2  (null)  1   14.06.2018 22:00:00
PARAM3  (null)  f   14.06.2018 22:00:00
PARAM4  (null)  3   14.06.2018 22:00:00
PARAM1  x       y   14.06.2018 22:00:01
PARAM2  1       4   14.06.2018 22:00:01
PARAM3  f       e   14.06.2018 22:00:01
PARAM4  3       32  14.06.2018 22:00:01
PARAM1  y       t   14.06.2018 22:00:02
PARAM2  12      45  14.06.2018 22:00:02
PARAM2  4       12  14.06.2018 22:00:02
PARAM3  r       d   14.06.2018 22:00:02
PARAM3  e       r   14.06.2018 22:00:02
PARAM4  32      40  14.06.2018 22:00:02