Oracle SQL:所有行都大于值(如果存在值)或所有小于值的行(如果值不存在)

时间:2018-01-28 01:57:22

标签: sql oracle rows

我有一个查询,它以格式返回数据:

ID      VALUE       INDEX
ID1     VALUE1      0
ID1     VALUE2      1
ID1     VALUE3      2
ID1     VALUE4      2
ID1     VALUE5      3
ID2     VALUE1      0
ID2     VALUE2      2
ID2     VALUE3      3
ID2     VALUE4      3
ID3     VALUE1      0
ID3     VALUE2      1
ID3     VALUE3      1
ID4     VALUE1      1
ID4     VALUE2      2

我需要找到特定ID的INDEX列大于或等于2的行。如果特定ID不存在这样的行,那么只有我的查询应该返回该ID的所有行,其中INDEX列少于比2。

e.g。在上面的数据场景中,我的查询应该返回行:

ID      VALUE       INDEX
ID1     VALUE3      2
ID1     VALUE4      2
ID1     VALUE5      3
ID2     VALUE2      2
ID2     VALUE3      3
ID2     VALUE4      3
ID3     VALUE1      0
ID3     VALUE2      1
ID3     VALUE3      1
ID4     VALUE2      2

我可以实现的一种方法是执行两次相同的查询。第一个查询将返回INDEX大于或等于2的所有行。在第二个查询中,我将尝试再次查找在第一个查询中找到的ID中不存在ID的所有行。

我不想两次执行相同的查询。我想知道是否可以使用单个查询完成工作。如果你对如何在单个查询中做到这一点有任何想法,请告诉我。

谢谢,

1 个答案:

答案 0 :(得分:3)

我认为窗口函数非常简单:

select t.*
from (select t.*, max(index) over (partition by id) as max_index
      from t
     ) t
where max_index < 2 or
      index >= 2;