我有一个查询,它以格式返回数据:
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的所有行。
我不想两次执行相同的查询。我想知道是否可以使用单个查询完成工作。如果你对如何在单个查询中做到这一点有任何想法,请告诉我。
谢谢,
答案 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;