【问题标题】:SQL Return the record where the value in a column have changedSQL 返回列中值发生变化的记录
【发布时间】:2021-11-11 15:43:29
【问题描述】:

我在 Hive 表中有数据,看起来像这样 -

VIN Mode event Start End
ABC123456789 Mode 1 Deauthorized 01/01/2010 00:00:00 05/05/2014 14:54:54
ABC123456789 Mode 1 Deauthorized 05/05/2014 14:54:54 05/13/2014 19:09:51
ABC123456789 Mode 1 Deauthorized 05/13/2014 19:09:51 11/13/2014 22:26:32
ABC123456789 Mode 1 Authorized 11/13/2014 22:26:32 11/13/2014 22:31:00
ABC123456789 Mode 1 Authorized 11/13/2014 22:31:00 11/14/2014 01:23:56
ABC123456789 Mode 2 Deauthorized 11/14/2014 01:23:56 11/18/2014 19:38:51
ABC123456789 Mode 2 Deauthorized 11/18/2014 19:38:51 11/18/2014 19:38:54
ABC123456789 Mode 2 Deauthorized 11/18/2014 19:38:54 11/18/2014 20:07:52
ABC123456789 Mode 2 Authorized 11/18/2014 20:07:52 12/17/2014 19:22:50
ABC123456789 Mode 2 Authorized 12/17/2014 19:22:50 02/25/2015 20:03:44
ABC123456789 Mode 2 Authorized 02/25/2015 20:03:44 02/25/2015 20:03:48
ABC123456789 Mode 3 Authorized 02/25/2015 20:03:48 02/25/2015 20:14:05
ABC123456789 Mode 3 Deauthorized 02/25/2015 20:14:05 02/25/2015 20:14:29
ABC123456789 Mode 3 Deauthorized 02/25/2015 20:14:29 02/25/2015 20:40:21

我想获得一个汇总数据,其中事件列中的值与之前的值相比发生了变化。数据点按开始时间戳的升序排列。我尝试了窗口功能,但它对我不起作用。结果看起来类似于我在下表中显示的内容。您能为此提出任何优化的解决方案吗?

VIN Mode event Start End
ABC123456789 Mode 1 Deauthorized 01/01/2010 00:00:00 05/05/2014 14:54:54
ABC123456789 Mode 1 Authorized 11/13/2014 22:26:32 11/13/2014 22:31:00
ABC123456789 Mode 2 Deauthorized 11/14/2014 01:23:56 11/18/2014 19:38:51
ABC123456789 Mode 2 Authorized 11/18/2014 20:07:52 12/17/2014 19:22:50
ABC123456789 Mode 3 Deauthorized 02/25/2015 20:14:05 02/25/2015 20:14:29

【问题讨论】:

  • 蜂巢!= MySQL。请仅使用您实际使用的数据库进行标记。

标签: sql performance hive time-series


【解决方案1】:

你可以使用lag():

select t.*
from (select t.*, 
             lag(event) over (partition by vin order by start) as prev_event
      from t
     ) t
where prev_event is null or prev_event <> event;

这会查看时间和vin 的变化。我不确定mode 是否也相关。如果是这样,请将其添加到partition by

【讨论】:

  • 谢谢戈登!虽然这与我正在寻找的非常接近,但我无法使用这种方法保留第一条记录。关于如何保留第一条记录的任何见解?
  • 例如ABC123456789 模式 1 取消授权 01/01/2010 00:00:00 05/05/2014 14:54:54
  • @Abhijit 。 . .我认为您没有在此答案中实现逻辑。它保留第一行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-07
  • 2013-07-02
  • 1970-01-01
  • 1970-01-01
  • 2020-09-25
  • 1970-01-01
相关资源
最近更新 更多