我有一个审核表,其中包含有更改时的快照。
| property_id | provider_id | datetime_in | datetime_out
|-------------|-------------|-----------------------|-----------------------|
| 1145 | 120 | 2018-11-01 00:00:00.0 | 2018-11-02 00:00:00.0 |
| 1145 | 180 | 2018-11-02 00:00:00.0 | 2018-11-03 00:00:00.0 |
| 1145 | 120 | 2018-11-03 00:00:00.0 | NULL
| 1110 | 150 | 2018-11-01 00:00:00.0 | NULL
我想选择在某个阶段与提供者X在一起但最终切换到新提供者的所有属性。 datetime_out
为NULL
表示该行代表当前状态。
我的输出应该类似于提供者120:
| property_id | old_provider| new_provider | switched_at
|-------------|-------------|--------------|---------------------
| 1145 | 120 | 180 | 2018-11-02 00:00:00.0
到目前为止,我已经尝试过此操作(基于另一个SO线程):
SELECT
a.property_id,
a.provider_id as new_provider,
lag(provider_id) over (partition by property_id order by datetime_in) as previous_value
FROM schema.mytable a
但是,这无法正常工作。查询此审计表的最佳方法是什么?
答案 0 :(得分:1)
看起来像下面这样:
SELECT
b.*
FROM (
SELECT
a.property_id,
a.provider_id as new_provider,
lag(provider_id) over (partition by property_id order by datetime_in) as previous_provider
FROM schema.mytable a
) b
WHERE b.previous_value IN (XXX)
AND b.previous_provider != b.new_provider