在此处使用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)。这不一定是两步过程;如果我可以抓住要处理的行集而没有理想的连接。
我希望我只是遗漏了一些非常简单的东西,但如果需要,我愿意使用分析函数进行分区。
答案 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
并避免对整个表进行排序。但我不知道如何在这里开展这项工作。