Sql 如何使用hive计算0-1序列的时间长度?
现在我有一个数据,比如:Sql 如何使用hive计算0-1序列的时间长度?,sql,hive,Sql,Hive,现在我有一个数据,比如: time(string) id(int) 201801051127 0 201801051130 0 201801051132 0 201801051135 1 201801051141 1 201801051145 0 201801051147 0 它有三个不同的部分,我想计算这三个部分的时间长度,比如第一个零序,时间长度是5分钟。如果我使用“按0和1分组”,第一个零序将与第三个零序合并,这不是我想要的。如何使用sql计算这三部分的长度?我的sql代码
time(string) id(int)
201801051127 0
201801051130 0
201801051132 0
201801051135 1
201801051141 1
201801051145 0
201801051147 0
它有三个不同的部分,我想计算这三个部分的时间长度,比如第一个零序,时间长度是5分钟。如果我使用“按0和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;
我不知道如何将其更改为配置单元代码。试试这个
SELECT id, ( max( TO_DATE ( time,'YYYYMMDDHHMI' ) )
- min( TO_DATE ( time,'YYYYMMDDHHMI' ) ) ) *24*60 diff_in_minutes from
(
select t.*,
row_number() OVER ( ORDER BY
TO_DATE ( time,'YYYYMMDDHHMI' ) )
- row_number() OVER ( PARTITION BY ID ORDER BY
TO_DATE ( time,'YYYYMMDDHHMI' ) ) seq
FROM Table1 t ORDER BY time
) GROUP BY ID,seq
ORDER BY max(time)
;
编辑:考虑到OP已标记了oracle,因此编写此答案。现在它已更改为hive
作为Oracle中迄今为止的配置单元中的替代方案
unix_timestamp(time, 'yyyyMMddhhmm')
可以使用。我建议进行一些转换:
- 添加指示行是否为其组中的第一行(标记为1,否则为null)
- 计算行前面的此类标志的数量,以了解其组号
然后你可以根据新的组号分组
Oracle版本(原始问题)
蜂巢版本
不同的数据库引擎使用不同的函数来处理日期/时间值,因此请使用Hive的unix\u时间戳
并处理它返回的秒数:
with q1 as (
select unix_timestamp(time, 'yyyyMMddHHmm')/60 time, id,
case id when lag(id) over(order by time) then null else 1 end first_in_group
from t
), q2 as (
select time, id, count(first_in_group) over (order by time) grp_id
from q1
)
select min(id) id, max(time) - min(time) minutes
from q2
group by grp_id
order by grp_id
哦,没错!数据库是oracle!您可以添加表定义(因此我们有名称和数据类型)和您尝试使用的SQL(具有分组0和1
)吗?请添加这两列的数据类型。第一个是日期或数字?SET@id\u label:=0代码>-此语法表明您正在使用但未使用,因为此子句在Oracle中不正确。请编辑您的问题并更正标记(删除oracle
并添加mysql
)。是的,我确认我使用了hive。在我意识到关键点之前,我对mysql、oracle、sqlserver等不同sql格式的数据库感到困惑。hive是另一个基于hadoop的数据库。此查询必须在之后具有按时间排序
。。。。来自表1 t
,即:来自表1 t按时间排序
。这是因为(维基百科的一句话):。数据库可能会以任何顺序返回行,因此ROWNUM可能会返回不可预测的结果。谢谢您的回答。行数总是强大的!我在答案中添加了一个蜂巢版本。太棒了!这个想法清晰易懂!存在的一个问题是,我应该选择grp\U id,min(id)id。。。这样程序就可以根据它进行分组和排序。
with q1 as (
select unix_timestamp(time, 'yyyyMMddHHmm')/60 time, id,
case id when lag(id) over(order by time) then null else 1 end first_in_group
from t
), q2 as (
select time, id, count(first_in_group) over (order by time) grp_id
from q1
)
select min(id) id, max(time) - min(time) minutes
from q2
group by grp_id
order by grp_id