Hive 如何基于配置单元中的日期值创建标志

Hive 如何基于配置单元中的日期值创建标志,hive,hiveql,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 |

我有一个样本表如下:

|  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。 例如:约翰有12月1日开始日期的记录;即此人于2018年11月1日结束日期后60天内。因此,此人的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   |
有什么想法吗

:使用datediff和case

使用lag获取每个名称上一行的结束日期。在此之后,可以使用max window函数对每个名称设置标志,该函数带有一个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

你能发布你解决这个问题的尝试吗?为什么雅各布的旗帜是0?@VK_217雅各布的旗帜是0;因为Jacob没有其他记录的起始日期在2018年12月6日结束日期的60天内。@Tanvir 2018年10月6日不是2018年12月6日结束日期的60天内?您是否在比较前一行的起始日期和结束日期?在这种情况下,您将需要使用LAG,该case语句逻辑将适用于每一行;正当但我需要核对每个人的记录。因此,John的所有开始日期都将与结束日期进行交叉检查。约翰的国旗设为1,因为约翰有12月1日开始的记录;在其中一个截止日期值(2018年11月1日)的60天内。
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
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