【问题标题】:Hive Find Start and End of Group or Changing pointHive 查找组的开始和结束或更改点
【发布时间】:2016-07-22 02:29:50
【问题描述】:

这是表格:

+------+------+
| Name | Time |   
+------+------+
| A    |    1 |   
| A    |    2 |   
| A    |    3 |   
| A    |    4 |   
| B    |    5 |   
| B    |    6 |   
| A    |    7 |   
| B    |    8 |   
| B    |    9 |   
| B    |   10 |   
+------+------+

我想写一个查询来获取:

+-------+--------+-----+
| Name  | Start  | End |
+-------+--------+-----+
| A     |     1  |   4 |
| B     |     5  |   6 |
| A     |     7  |   7 |
| B     |     8  |  10 |
+-------+--------+-----+

有人知道怎么做吗?

【问题讨论】:

  • 这称为孤岛问题。我不知道HIVE 但在SQL Server 我们使用窗口函数解决它。这是 DEMO

标签: sql group-by hive hiveql boundary


【解决方案1】:

这不是最有效的方法,但确实有效。

SELECT name, min(time) AS start,max(time) As end 
FROM (
   SELECT name,time, time- DENSE_RANK()  OVER (partition by name ORDER BY 
   time) AS diff
   FROM foo
) t 
GROUP BY name,diff;

我建议尝试以下查询并构建一个 GenericUDF 来识别差距,这更容易:)

SELECT name, sort_array(collect_list(time)) FROM foo GROUP BY name;

【讨论】:

    猜你喜欢
    • 2012-10-18
    • 2023-04-02
    • 1970-01-01
    • 2016-10-31
    • 2013-03-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2020-02-17
    相关资源
    最近更新 更多