查询目标条件

时间:2019-10-30 21:54:01

标签: sql presto

我需要查询一个表以说明多个更改事件。表(见下文)按Date分区,其中每天为员工拍摄快照。我想创建一个显示里程碑更改的表。

即我要显示最终的导出:

  1. 首次出现的日期(雇用日期
  2. Type更改时的任何记录
  3. 它们出现的最后日期(终止日期

这最终显示了类型的变化以及雇用/终止日期。

我想知道构建它的好方法是什么?我可以看到一个查询,该查询采用上面列出的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
+-----------+------+----------+--------+

在上面可以推断出我是:

  • 雇用1/1/19
  • 更改了类型1/3/19
  • 终止于1/7/19

1 个答案:

答案 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的使用非常方便。替代方法基本上是分别比较每列。