我很好奇编写查询的最佳方法。
我有一个ID和值表。我想排除ID较低的所有行中val小于val的行。
我正在将表与ID-1上的表自身连接在一起,但这并不是一直都有效。
一些样本数据
CREATE TEMP TABLE new_temp_table (
id integer,
val integer
);
INSERT INTO new_temp_table (id, val)
VALUES (0, 300),
(1, 150),
(2, 100),
(3, 200),
(4, 320),
(5, 120),
(6, 220),
(7, 340);
我想要以下输出。
--- id --- val
--- 0 --- 300
--- 4 --- 320
--- 7 --- 340
任何帮助/指导将不胜感激。
答案 0 :(得分:5)
不存在:
select t.* from new_temp_table t
where not exists (
select 1 from new_temp_table
where id < t.id and val > t.val
)
请参见demo。
结果:
| id | val |
| --- | --- |
| 0 | 300 |
| 4 | 320 |
| 7 | 340 |
答案 1 :(得分:1)
根据您的描述,您可以使用窗口函数来计算前面所有行的最大值,然后根据该值进行过滤:
select id, val
from (select ntt.*, max(val) over (order by id rows between unbounded preceding and 1 preceding) as preceding_max
from new_temp_table ntt
) t
where preceding_max is null or val > preceding_max;
Here是db <>小提琴。
注意:在没有窗口规范的情况下编写此逻辑很诱人:
select id, val
from (select ntt.*, max(val) over (order by id) as preceding_max
from new_temp_table ntt
) t
where preceding_max is null or val >= preceding_max;
但是,这将返回最大等于更早的最大值的行。
答案 2 :(得分:1)
我会做的:
select
id, val, max_prev_val
from (
select
id,
val,
max(val) over(order by id rows between unbounded preceding and 1 preceding)
as max_prev_val
from new_temp_table
) x
where val >= max_prev_val or max_prev_val is null
结果:
id val max_prev_val
----------------------------------------
0 300 <null>
4 320 300
7 340 320