Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.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
Hive 配置单元SQL聚合将多个SQL合并为一个SQL_Hive_Hiveql - Fatal编程技术网

Hive 配置单元SQL聚合将多个SQL合并为一个SQL

Hive 配置单元SQL聚合将多个SQL合并为一个SQL,hive,hiveql,Hive,Hiveql,我有一个串行sqls,如: select count(distinct userId) from table where hour >= 0 and hour <= 0; select count(distinct userId) from table where hour >= 0 and hour <= 1; select count(distinct userId) from table where hour >= 0 and hour <= 2; ..

我有一个串行sqls,如:

select count(distinct userId) from table where hour >= 0 and hour <= 0;
select count(distinct userId) from table where hour >= 0 and hour <= 1;
select count(distinct userId) from table where hour >= 0 and hour <= 2;
...
select count(distinct userId) from table where hour >= 0 and hour <= 14;

有没有办法将它们合并到一个sql中?

看起来您正试图保留一个以小时为单位的累积计数。为此,可以使用窗口函数,如下所示:

选择不同的 一小时一小时, SUMCALEALESCEM.include,0超过订单1小时,作为累计_计数 FROM-获取所有记录,0表示包含 选择 名称 小时 0作为包含项 从…起 桌子 A. 左连接 -获取每个“名称”的“小时数”最低的记录,以及包含的“小时数”最低的记录 选择 名称 一小时一小时, 1包括 从…起 桌子 分组 名称 M 关于M.name=A.name M.hour=A.hour ; 可能有一种更简单的方法,但这通常会给出正确的答案

说明: 这对同一个输入表使用了2个子查询,其中包含一个名为include的派生字段,用于跟踪哪些记录应贡献给每个bucket的最终总计。第一个子查询仅获取表中的所有记录,并将0指定为include。第二个子查询查找所有唯一的名称和该名称出现的最低时隙,并将它们指定为1作为include。这两个子查询由封闭查询左连接


最外层的查询执行coalescm.include,0来填充由左连接生成的任何NULL,这些1和0按小时求和和并打开窗口。这需要是一个SELECT DISTINCT,而不是使用GROUP BY,因为GROUP BY希望同时列出小时和包含,但它最终会将给定小时组中的每条记录折叠成一行,并且包含=1。DISTINCT在总和之后应用,因此它将在不丢弃任何输入行的情况下删除重复项。

看起来您正在尝试保留一个以小时为括号的累积计数。为此,可以使用窗口函数,如下所示:

选择不同的 一小时一小时, SUMCALEALESCEM.include,0超过订单1小时,作为累计_计数 FROM-获取所有记录,0表示包含 选择 名称 小时 0作为包含项 从…起 桌子 A. 左连接 -获取每个“名称”的“小时数”最低的记录,以及包含的“小时数”最低的记录 选择 名称 一小时一小时, 1包括 从…起 桌子 分组 名称 M 关于M.name=A.name M.hour=A.hour ; 可能有一种更简单的方法,但这通常会给出正确的答案

说明: 这对同一个输入表使用了2个子查询,其中包含一个名为include的派生字段,用于跟踪哪些记录应贡献给每个bucket的最终总计。第一个子查询仅获取表中的所有记录,并将0指定为include。第二个子查询查找所有唯一的名称和该名称出现的最低时隙,并将它们指定为1作为include。这两个子查询由封闭查询左连接


最外层的查询执行coalescm.include,0来填充由左连接生成的任何NULL,这些1和0按小时求和和并打开窗口。这需要是一个SELECT DISTINCT,而不是使用GROUP BY,因为GROUP BY希望同时列出小时和包含,但它最终会将给定小时组中的每条记录折叠成一行,并且包含=1。DISTINCT在总和之后应用,因此它将删除重复项而不丢弃任何输入行。

这不是DISTINCT count,DISTINCT count也不是加法。因此,在0和1之间的小时的不同计数小时0的不同计数+小时的不同计数=1它应该是不同的用户ID,而不是不同的小时+计数。如果同一用户在不同的应用程序中出现两次,该怎么办hours@leftjoin我更新了这个答案。这正好产生了我相信OP所追求的结果,我认为它也解决了您的问题。这不是distinct count,distinct count也不是加法。因此,在0和1之间的小时的不同计数小时0的不同计数+小时的不同计数=1它应该是不同的用户ID,而不是不同的小时+计数。如果同一用户在不同的应用程序中出现两次,该怎么办hours@leftjoin我更新了这个答案。这正是我相信OP所追求的结果,我认为它也解决了您的问题。操作时尝试使用用例操作时尝试使用用例