我正在尝试排除另一行中存在值的行。
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原因。我失去了任何帮助,将不胜感激。预先感谢!
答案 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