PL/SQL选择数据的分区窗口
在这里与Oracle 11g合作 我试图找出如何针对下面的示例表编写特定查询: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
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
避免对整张桌子进行排序。但我不知道如何在这里做到这一点 我知道这很简单。虽然不是星期五,但感觉像是星期五。我使用秩函数得到了这个结果,但是这个简单的版本更加优雅和高效。它也不必对整个表进行排序,因为一旦处理了一行,状态就会变为“完成”。对吗?不确定。知道您只需要结果中的一行,而不需要进行完整排序,这可能足够聪明了。