我需要查询一个表以说明多个更改事件。表(见下文)按Date
分区,其中每天为员工拍摄快照。我想创建一个显示里程碑更改的表。
即我要显示最终的导出:
Type
更改时的任何记录这最终显示了类型的变化以及雇用/终止日期。
我想知道构建它的好方法是什么?我可以看到一个查询,该查询采用上面列出的3个条件中的UNION
,然后按日期排序,然后按雇员排序,但是不确定是否有效。
+-----------+------+----------+--------+
| Employee | Type | Date | Active |
+-----------+------+----------+--------+
| urdearboy | 1 | 1/1/2019 | 1 | '<---- Want
+-----------+------+----------+--------+
| urdearboy | 1 | 1/2/2019 | 1 |
+-----------+------+----------+--------+
| urdearboy | 4 | 1/3/2019 | 1 | '<---- Want
+-----------+------+----------+--------+
| urdearboy | 4 | 1/4/2019 | 1 |
+-----------+------+----------+--------+
| urdearboy | 4 | 1/5/2019 | 1 |
+-----------+------+----------+--------+
| urdearboy | 4 | 1/6/2019 | 1 |
+-----------+------+----------+--------+
| urdearboy | 4 | 1/7/2019 | 0 | '<---- Want
+-----------+------+----------+--------+
在上面可以推断出我是:
答案 0 :(得分:0)
一种方法是使用lag()
:
select t.*
from (select t.*,
lag(date) over (partition by employee, type, active order by prev_date) as prev_date_eta,
lag(date) over (partition by employee order by date) as prev_date
from t
) t
where prev_date_eta is null or
prev_date_eta <> prev_date;
此方法将具有相同属性的前一个日期 与该员工的总体前一个日期进行比较。当这些相同时,什么都没有改变,因此该行被滤除。
要比较多个列时,partition by
的使用非常方便。替代方法基本上是分别比较每列。