代码之家  ›  专栏  ›  技术社区  ›  user613114

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

  •  1
  • user613114  · 技术社区  · 6 年前

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

    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的索引列大于或等于2的行。如果特定ID不存在此类行,则只有我的查询应该返回索引列小于2的该ID的所有行。

    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
    

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

    我不想执行两次相同的查询。我想知道是否可以使用单个查询完成这项工作。请让我知道,如果你有任何关于如何在单一查询的想法。

    谢谢

    1 回复  |  直到 6 年前
        1
  •  3
  •   Gordon Linoff    6 年前

    我认为窗口函数使这一点非常简单:

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