PL / SQL选择数据的分区窗口

时间:2009-11-19 18:55:09

标签: sql oracle plsql oracle11g

在此处使用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,其状态为按优先级和日期排序。

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

对于第二步,我将把这些数据加入到表中以获取我想要处理的集合的行(例如:1 Q)。这不一定是两步过程;如果我可以抓住要处理的行集而没有理想的连接。

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

1 个答案:

答案 0 :(得分: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

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