0

在此处使用 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 Q3 Q,但不能同时返回,因为它们具有相同的优先级和日期。如果 3 Q 设置为 STATUS='DONE',则查询应返回 1 Q。

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

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

4

1 回答 1

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

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

于 2009-11-19T19:34:33.193 回答