SQL-选择列值大于其前一行的行

时间:2019-06-18 17:48:55

标签: sql postgresql

我很好奇编写查询的最佳方法。

我有一个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 

任何帮助/指导将不胜感激。

3 个答案:

答案 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