我在psa中有一个表,在该表中捕获对源表中记录的更改。假设它看起来像这样:
+-----+------------+----------------+------------------+------------------+
| PK | Check_cols | Dont_care_cols | start_ts | end_ts |
+-----+------------+----------------+------------------+------------------+
| 123 | abc | def | 1/1/20 00:10:00 | 1/2/20 13:13:23 |
| 123 | abc | dhf | 1/2/20 13:13:23 | 1/3/20 04:21:00 |
| 123 | abc | dhz | 1/3/20 04:21:00 | 1/5/20 12:15:00 |
| 123 | abd | dyz | 1/5/20 12:15:00 | 1/9/20 15:16:00 |
| 123 | abc | dyz | 1/9/20 15:16:00 | null |
| 456 | ghi | jkl | 1/2/20 03:45:00 | 1/10/20 00:00:00 |
| 456 | lmn | opq | 1/10/20 00:00:00 | null |
+-----+------------+----------------+------------------+------------------+
我想从该表中仅使用check\u cols的值构建一个类型2维度(跟踪记录开始和停止时间的变化),如下所示。我正在寻找一个纯sql解决方案,没有循环。
check\u cols由多个列组成,但我将使用md5散列来查找更改。因为我的维度只关心check\u cols,所以有时时间戳记录不是我所需要的。例如,如果dont\u care\u cols中的值发生更改,但是check\u cols中的值都没有更改。
根据上面的数据,我需要以下结果集:
+-----+------------+------------------+------------------+
| PK | Check_cols | start_ts | end_ts |
+-----+------------+------------------+------------------+
| 123 | abc | 1/1/20 00:10:00 | 1/5/20 12:15:00 |
| 123 | abd | 1/5/20 12:15:00 | 1/9/20 15:16:00 |
| 123 | abc | 1/9/20 15:16:00 | null |
| 456 | ghi | 1/2/20 03:45:00 | 1/10/20 00:00:00 |
| 456 | lmn | 1/10/20 00:00:00 | null |
+-----+------------+------------------+------------------+
我尝试过使用窗口函数来比较超前和滞后值,得到最小值和最大值,等等,但是我无法理解第一个表中PK123的这种边缘情况。我也没有通过google/stackoverflow/等找到解决方案。大多数方法依赖于每日运行的快照。如果有逻辑更改,我希望能够重建目标表。有人有想法吗?
1条答案
按热度按时间cgh8pdjw1#
我不知道这是不是最好的答案,也不知道它是否解决了您的所有用例,但请尝试一下,让我知道是否有边缘的情况,绊倒了它。有点像黑客。此外,我还向用例中添加了一些记录:
从那以后,我试图找到一种创建“组”的方法,使用一种我希望能经得起您所有用例考验的方法: