SQL根据另一行中的值排除行

时间:2019-03-04 14:42:17

标签: sql

我正在尝试排除另一行中存在值的行。

select * from TABLE1

ROW SEQ VALUE
1   1   HIGH
1   2   HIGH
1   3   LOW
1   4   HIGH
2   1   MED
2   2   HIGH
2   3   HIGH
2   4   LOW
2   5   HIGH
2   6   HIGH

所有数据都来自同一张表,而我想做的是排除VALUE ='LOW'的行以及SEQ <=值='LOW'的行。这是我想要的结果:

 ROW SEQ VALUE
1   4   HIGH
2   5   HIGH
2   6   HIGH

这里的工作正在进行中,但只排除了一行

select * from TABLE1
where not exists(select VALUE from TABLE1 
where ROW = ROW and VALUE = 'LOW' and SEQ <= SEQ)

由于选择是硬编码的,因此我需要将其写入where原因。我失去了任何帮助,将不胜感激。预先感谢!

4 个答案:

答案 0 :(得分:0)

select *
from table1
left outer join (
    select row, max(seq) as seq
    from table1
    where value = 'low'
    group by row
) lows on lows.row = table1.row
where lows.row is null
   or table1.seq > lows.seq

答案 1 :(得分:0)

您应该为表加别名。令您惊讶的是,您根本没有别名,因此您从此查询中得到任何结果。

select * 
from TABLE1 As t0
where not exists(
    select VALUE 
    from TABLE1 As t1
    where t0.ROW = t1.ROW 
    and t1.VALUE = 'LOW' 
    and t0.SEQ <= t1.SEQ
)

答案 2 :(得分:0)

对于您提到的结果,您似乎想要最后一个“低”之后的行。一种方法是:

select t1.*
from table1 t1
where t1.seq > (select max(t2.seq) from table1 tt1 where tt1.row = t1.row and tt1.value = 'LOW');

(注意:这需要一个“低”行。如果没有“低”行,并且您希望返回所有行,则可以轻松地将其添加到查询中。)

或者类似地,使用not exists

select t1.*
from table1 t1
where not exists (select 1
                  from table1 tt1 
                  where tt1.row = t1.row and
                        tt1.seq > t.seq and
                        tt1.value = 'LOW'
                 );

这可能是您问题的最直接翻译。

但是,我更可能使用窗口函数:

select t1.*
from (select t1.*,
             max(case when t1.value = 'low' then seqnum end) over (partition by row) as max_low_seqnum
      from table1 t1
     ) t1
where seqnum > max_low_seqnum;

如果没有“低”行,您可能想添加or max_low_seqnum is null以返回所有行。

答案 3 :(得分:0)

您可以将窗口函数与累积方法一起使用:

actions