Oracle SQL:所有行大于值(如果值存在)或所有行小于值(如果值不存在)
Posted
技术标签:
【中文标题】Oracle SQL:所有行大于值(如果值存在)或所有行小于值(如果值不存在)【英文标题】:Oracle SQL: All rows greater than value (if value is present) OR all rows less than value (if value is not present) 【发布时间】:2018-01-28 01:57:21 【问题描述】:我有一个查询,它以以下格式返回数据:
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。
例如在上述数据场景中,我的查询应返回如下行:
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】:我认为窗口函数让这变得非常简单:
select t.*
from (select t.*, max(index) over (partition by id) as max_index
from t
) t
where max_index < 2 or
index >= 2;
【讨论】:
感谢 Gordon 的快速反馈。根据初步测试,它似乎正在工作。我会在整个表上执行这个查询,并尽早分享反馈,以上是关于Oracle SQL:所有行大于值(如果值存在)或所有行小于值(如果值不存在)的主要内容,如果未能解决你的问题,请参考以下文章