sql:如何使用空值分组/分区交错表

uajslkp6  于 2021-06-27  发布在  Hive
关注(0)|答案(1)|浏览(326)

假设我有两个表,一个描述带有某种时间戳的事件,另一个描述时段(由它们的开始时间给出),如下所示:

create table periods (name varchar(16), start int);
insert into periods values
    ('day1', 24), ('day2', 35), ('day3', 49);

create table events (id varchar(16), ts int);
insert into events values
    ('pak', 27), ('mak', 41), ('kew', 30),
    ('sippa', 58), ('fucha', 50), ('den', 28);

我希望最终将事件与句点匹配,但使用“交错”方法,而不是连接。然后我想象“交错”集会是这样的:

select * from (
    (select name as per, s as x, 1 as pri, null as id from periods) 
    union all
    (select null as per, t as x, 2 as pri, id from events)
) v order by x, pri;

+------+------+-----+-------+
| per  | x    | pri | id    |
+------+------+-----+-------+
| day1 |   24 |   1 | NULL  |
| NULL |   27 |   2 | pak   |
| NULL |   28 |   2 | den   |
| NULL |   30 |   2 | kew   |
| day2 |   35 |   1 | NULL  |
| NULL |   41 |   2 | mak   |
| day3 |   49 |   1 | NULL  |
| NULL |   50 |   2 | fucha |
| NULL |   58 |   2 | sippa |
+------+------+-----+-------+

现在我想用 select ... over ... partition by 这里是非空的行 per 字段和该字段为空的后续行将落在同一分区中,我可以在该分区上使用 min(x) (或句号)。
但我不知道怎么写这个 partition by . 凭什么?
提前谢谢!
p、 关于特定的sql方言,这是关于 hive -这就是为什么我试图避免join,但我希望能够将提示与其他db引擎的语法相适应。
已解决-请参阅下面接受的答案。我们需要应用其他嵌套查询 COUNTper 列。这将返回到目前为止的行数(即高于当前值),该字段的值为非空。所以我们得到了一个列,每个组有单独的编号。外部查询只需要按此列进行分区。

66bbxpm5

66bbxpm51#

许多数据库支持iso/ansi标准 IGNORE NULL 他的论点 LAG() . 这只允许:

select v.*,
       lag(per ignore nulls) over (order by x) as new_per
from ((select name as per, s as x, 1 as pri, null as id from periods 
      ) union all
      (select null as per, t as x, 2 as pri, id from events
      )
     ) v
order by x, pri;

hive不支持此选项,但您可以使用两个级别的窗口函数执行相同的操作:

select v.*,
       max(per) over (partition by grp) as new_per
from (select v.*,
             count(per) over (order by x) as grp
      from ((select name as per, s as x, 1 as pri, null as id from periods 
            ) union all
            (select null as per, t as x, 2 as pri, id from events
            )
           ) v
    ) v
order by x, pri;

相关问题