【问题标题】:If a end time value has NULL, Replace the value with next start time of same id如果结束时间值为 NULL,则将该值替换为相同 id 的下一个开始时间
【发布时间】:2018-03-12 14:16:38
【问题描述】:

我有一个包含 3 个字段的表格。

  • 开始时间
  • 结束时间
  • 身份证

如果结束时间是NULL,我需要替换为相同ID的最近时间。

----------------------------------
| ID | Start_time  |    End_time |
----------------------------------
| 1  | 2016-01-01  |        NULL |
| 2  | 2016-01-01  |  2016-01-02 |
| 1  | 2016-01-02  |  2016-01-03 |
| 1  | 2016-01-03  |  2016-01-04 |

预期输出

---------------------------------
| ID | Start_time |    End_time |
---------------------------------
| 1  | 2016-01-01 |  2016-01-02 |
| 2  | 2016-01-01 |  2016-01-02 |
| 1  | 2016-01-02 |  2016-01-03 |
| 1  | 2016-01-03 |  2016-01-04 |

【问题讨论】:

  • 您的预期结果与您对其应有的描述不符。如果您需要选择具有相同 ID 的最接近时间,那么对于 ID=1,它应该是 2016-01-03 而不是 2016-01-02,因为它的 ID=2
  • 另外,定义最近时间:它是绝对值最近的,最近的还是最近的?
  • 最新的上一个
  • 最新的前面基于哪些列?您应该使用一些列/列来定义排序。您可以通过 case when 相应地使用 LEAD/LAG 函数。

标签: mysql sql hive hql hiveql


【解决方案1】:

您可以对 id 使用子查询分组来获取 min end_time

  select a.id, a.Start_time
      , case when a.End_time is null then t.min_end_time else  a.End_time end End_time 
  from my_table 
  inner join (
  select id, min(End_time) min_end_time
  from my_table 
  group by id ) t on t.id = a.id

【讨论】:

  • 不是最短结束时间,而是我需要的下一个前一个值
猜你喜欢
  • 2018-01-03
  • 2017-11-04
  • 1970-01-01
  • 2013-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多