如何筛选复杂过滤器上的行

dsi*_*ard 5 sql oracle

我在表格中有这些行

ID  Name    Price   Delivery
==  ====    =====   ========
1   apple   1       1
2   apple   3       2
3   apple   6       3
4   apple   9       4
5   orange  4       6
6   orange  5       7
Run Code Online (Sandbox Code Playgroud)

如果没有第三次交货,我希望第三次交货(交货= 3)或最后价格的价格.

它会给我这个:

ID  Name    Price   Delivery
==  ====    =====   ========
3   apple   6       3
6   orange  5       7
Run Code Online (Sandbox Code Playgroud)

我不需要一个完整的解决方案,但是对于寻找什么的想法将不胜感激.

Mar*_*ers 3

使用ROW_NUMBER两次 - 一次过滤掉第三次传递后的行,第二次查找剩余的最后一行(即典型的每组查询的最大值)。

我已经使用 CTE 实现了这一点。我在 SQL Server 中测试了它,但我相信 Oracle 支持相同的语法。

WITH T1 AS (
    SELECT
        ID, Name, Price, Delivery,
        ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Delivery) AS rn
    FROM Table1
), T2 AS (
    SELECT
        t1.*,
        ROW_NUMBER() OVER (PARTITION BY Name ORDER BY Delivery DESC) AS rn2
    FROM T1
    WHERE rn <= 3
)
SELECT ID, Name, Price, Delivery
FROM T2
WHERE rn2 = 1
Run Code Online (Sandbox Code Playgroud)

结果:

ID  Name    Price  Delivery
3   apple   6      3       
6   orange  5      7       
Run Code Online (Sandbox Code Playgroud)