如何在Hive中基于日期值创建标记

时间:2018-12-06 16:18:01

标签: hive hiveql

我有一个示例表,如下:

|  name | startdate | enddate    | flg |
|-------|-----------|------------|-----|
| John  | 6/1/2018  | 7/1/2018   |     |
| John  | 10/1/2018 | 11/1/2018  |     |
| John  | 12/1/2018 | 12/20/2018 |     |
| Ron   | 3/1/2017  | 9/1/2017   |     |
| Ron   | 5/1/2018  | 10/1/2018  |     |
| Jacob | 6/10/2018 | 6/12/2018  |     |

我要在输出中显示的内容:如果某人在“结束日期”值的60天内(或2个月内)具有“开始日期”;然后将该人的flg设置为1。否则将flg设为0。 例如:John记录了12月1日开始日期;在此人的结束日期之一的60天内(2018年11月1日)。因此,此人的flg设置为1。

因此,输出应如下所示:

| Name  | startdate | enddate    | flg |
|-------|-----------|------------|-----|
| John  | 6/1/2018  | 7/1/2018   | 1   |
| John  | 10/1/2018 | 11/1/2018  | 1   |
| John  | 12/1/2018 | 12/20/2018 | 1   |
| Ron   | 3/1/2017  | 9/1/2017   | 0   |
| Ron   | 5/1/2018  | 10/1/2018  | 0   |
| Jacob | 6/10/2018 | 6/12/2018  | 0   |

请问有什么主意吗?

2 个答案:

答案 0 :(得分:1)

Date Functions:使用datediffcase

select Name,startdate,enddate,
       case when datediff(enddate,startdate) < 60 then 1 else 0 end flag
from table

如果您要比较上一行的结束日期,请使用lag()

select Name,startdate,enddate,
    case when datediff(startdate,prev_enddate) < 60 then 1 else 0 end flag
from 
(
    select Name,startdate,enddate,
       lag(endate) over(partition by Name order by startdate,enddate) as prev_enddate
    from table
) t

答案 1 :(得分:0)

使用lag获取上一行的结束日期(按名称)。之后,可以使用带有flag表达式的max窗口函数为每个名称设置case,该表达式检查每个名称是否至少满足一次60天差异。

select name
      ,startdate
      ,enddate
      ,max(case when datediff(startdate,prev_end_dt) < 60 then 1 else 0 end) over(partition by name) as flag
from (select t.*
            ,lag(enddate) over(partition by name order by startdate) as prev_end_dt
      from table t
     ) t