现在我有了如下数据:
time(string) id(int)
201801051127 0
201801051130 0
201801051132 0
201801051135 1
201801051141 1
201801051145 0
201801051147 0
它有三个不同的部分,我想计算这三部分的时间长度,比如第一个零序,时间长度是5分钟。如果我使用'groupby0和1',第一个零序将与第三个零序合并,这不是我想要的。如何用sql计算这三部分的长度?我的sql代码如下:
SET @id_label:=0;
SELECT id_label,id,TIMESTAMPDIFF(MINUTE,MIN(DATE1),MAX(DATE1)) FROM
(SELECT id, DATE1, id_label FROM (
SELECT id, str_to_date ( TIME,'%Y%m%d%H%i' ) DATE1,
@id_label := IF(@id = id, @id_label, @id_label+1) id_label,
@id := id
FROM test.t
ORDER BY str_to_date ( TIME,'%Y%m%d%h%i' )
) a)b
GROUP BY id_label,id;
我不知道怎么把它改成Hive代码。
2条答案
按热度按时间lrpiutwd1#
试试这个。
演示
编辑:这个答案是考虑到op已经标记了
oracle
。现在改为hive
.作为 hive 的替代品
TO_DATE
在甲骨文中,可以使用。
ncecgwcz2#
我建议一些转变:
添加一个指示行是否是其组中的第一行(标记为1,否则为空)
计算行前面的此类标志的数目以了解其组号
然后你就可以按新的组号分组了。
oracle版本(原始问题)
sql小提琴
配置单元版本
不同的数据库引擎使用不同的函数来处理日期/时间值,所以使用hive的
unix_timestamp
处理它返回的秒数: