【问题标题】:PL/SQL to Select a Partition Window of DataPL/SQL 选择数据的分区窗口
【发布时间】:2010-12-18 10:50:32
【问题描述】:

在此处使用 Oracle 11g。

我试图弄清楚如何针对下面的示例表编写特定查询:

 ID TYPE   PRIORITY    STATUS   DATE
 ----------------------------------------------------
 1  Q      A           NEW      01-OCT-2009
 1  Q      A           NEW      01-OCT-2009
 1  Q      A           NEW      01-OCT-2009
 1  Q      A           NEW      01-OCT-2009
 1  Q      A           NEW      01-OCT-2009
 1  Q      A           NEW      01-OCT-2009
 1  Q      A           NEW      01-OCT-2009
 1  Q      A           NEW      01-OCT-2009
 2  R      B           NEW      01-OCT-2009
 2  R      B           NEW      01-OCT-2009
 2  R      B           NEW      01-OCT-2009
 2  R      B           NEW      01-OCT-2009
 3  R      A           NEW      01-OCT-2009
 3  Q      A           NEW      01-OCT-2009
 3  Q      A           NEW      01-OCT-2009

这是我希望查询执行的伪 PL/SQL:

 SELECT ID, TYPE
 FROM DATA_TABLE
 WHERE ROWNUM = 1 AND STATUS = 'NEW'
 GROUP BY ID, TYPE
 ORDER BY PRIORITY, DATE

我想获取下一组 ID,TYPE,其状态为 NEW,按优先级和日期排序。

在上述情况下,语句应该返回任一 1 Q 或3 Q,但不能同时返回,因为它们具有相同的优先级和日期。如果 3 Q 设置为 STATUS='DONE' 则查询应返回 1 Q。

在第二步中,我将把这些数据重新连接到表中,以获取我想要处理的集合的行(例如:1 Q)。这不必是一个两步的过程。如果我可以在没有理想连接的情况下获取要处理的行集。

我希望我只是遗漏了一些非常简单的东西,但如果需要,我愿意使用分析函数进行分区。

【问题讨论】:

    标签: sql oracle plsql oracle11g


    【解决方案1】:
    SELECT * FROM (SELECT ID, TYPE FROM DATA_TABLE WHERE STATUS = 'NEW' ORDER BY PRIORITY, DATE) WHERE ROWNUM = 1
    

    应该可以的。您不想按 ID 和 TYPE 分组,因为您实际上并没有尝试对匹配给定 ID 和 TYPE 的行执行任何类型的聚合。如果你只关心一列(比如 DATE),你可以说

    SELECT ID, TYPE FROM DATA_TABLE WHERE DATE = (SELECT MIN(DATE) FROM DATA_TABLE) AND ROWNUM = 1
    

    并避免对整个表格进行排序。但我不知道如何在这里工作。

    【讨论】:

    • 我知道这很简单。感觉就像星期五,即使它不是。我使用 RANK 函数得到了这个,但这个简单的版本更加优雅和高效。它也不应该对整个表进行排序,因为一旦处理了一行,状态就会翻转为“完成”。对吗?
    • 不确定。知道您只想要结果中的一行而不进行完整排序可能足够聪明。
    猜你喜欢
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-21
    • 2021-11-29
    相关资源
    最近更新 更多