【问题标题】:Query target conditions查询目标条件
【发布时间】:2019-10-31 06:17:49
【问题描述】:

我需要查询一个表来记录多个更改事件。该表(见下文)按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
+-----------+------+----------+--------+

在上面可以推断出我是:

  • 2019 年 1 月 1 日录用
  • 更改类型 1/3/19
  • 于 2019 年 1 月 7 日终止

【问题讨论】:

    标签: sql presto


    【解决方案1】:

    一种方法是使用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 非常方便。另一种方法基本上是单独比较每一列。

    【讨论】:

      猜你喜欢
      • 2012-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-26
      • 1970-01-01
      • 2011-07-01
      相关资源
      最近更新 更多