Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何使用hive计算0-1序列的时间长度?_Sql_Hive - Fatal编程技术网

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