Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PL/SQL选择数据的分区窗口_Sql_Oracle_Plsql_Oracle11g - Fatal编程技术网

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

PL/SQL选择数据的分区窗口,sql,oracle,plsql,oracle11g,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

在这里与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,它的状态是按优先级和日期排序的NEW

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

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

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

SELECT * FROM (SELECT ID, TYPE FROM DATA_TABLE WHERE STATUS = 'NEW' ORDER BY PRIORITY, DATE) WHERE ROWNUM = 1
这应该行得通。您不希望按ID和类型分组,因为您实际上没有尝试对与给定ID和类型匹配的行执行任何类型的聚合。如果你只关心一列(比如日期),你可以说

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

避免对整张桌子进行排序。但我不知道如何在这里做到这一点

我知道这很简单。虽然不是星期五,但感觉像是星期五。我使用秩函数得到了这个结果,但是这个简单的版本更加优雅和高效。它也不必对整个表进行排序,因为一旦处理了一行,状态就会变为“完成”。对吗?不确定。知道您只需要结果中的一行,而不需要进行完整排序,这可能足够聪明了。