从审核表中选择旧/新值

时间:2019-07-17 13:07:12

标签: sql hive hiveql

我有一个审核表,其中包含有更改时的快照。

| 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_outNULL表示该行代表当前状态。

我的输出应该类似于提供者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

但是,这无法正常工作。查询此审计表的最佳方法是什么?

1 个答案:

答案 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