假设我有两个表,一个描述带有某种时间戳的事件,另一个描述时段(由它们的开始时间给出),如下所示:
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引擎的语法相适应。
已解决-请参阅下面接受的答案。我们需要应用其他嵌套查询 COUNT
到 per
列。这将返回到目前为止的行数(即高于当前值),该字段的值为非空。所以我们得到了一个列,每个组有单独的编号。外部查询只需要按此列进行分区。
1条答案
按热度按时间66bbxpm51#
许多数据库支持iso/ansi标准
IGNORE NULL
他的论点LAG()
. 这只允许:hive不支持此选项,但您可以使用两个级别的窗口函数执行相同的操作: