在多个数据行中使用Oracle SQL筛选行

在多个数据行中使用Oracle SQL筛选行,sql,oracle,Sql,Oracle,我有以下用于说明的数据: Record_ID | Product | Status 1 | Car | Active 2 | Car | Awesome 3 | Truck | Active 4 | Truck | Defect Record_ID | Product | 1 | Car | 我希望生成如下查询结果: Record_ID | Product | Status 1

我有以下用于说明的数据:

Record_ID | Product | Status
1         | Car     | Active
2         | Car     | Awesome
3         | Truck   | Active
4         | Truck   | Defect
Record_ID | Product |
1         | Car     |
我希望生成如下查询结果:

Record_ID | Product | Status
1         | Car     | Active
2         | Car     | Awesome
3         | Truck   | Active
4         | Truck   | Defect
Record_ID | Product |
1         | Car     |
卡车被排除在外,因为它在记录_ID 4中有缺陷信息

记录ID 2被排除,因为状态“活动”的权重大于状态“很棒”

是否有机会通过一个Oracle查询返回结果

谢谢

使用下面的查询

     select Record_ID,product from
        (
        select Record_ID, product ,row_number() over(partition by product order by Record_ID ) as r_no
        from ss
        where product not  in (select product from ss where status='Defect'))
        where R_no=1

仅使用单个表扫描:

Oracle 11g R2架构设置

CREATE TABLE Product_Statuses ( Record_ID, Product, Status ) AS
          SELECT 1, 'Car',      'Active'  FROM DUAL
UNION ALL SELECT 2, 'Car',      'Awesome' FROM DUAL
UNION ALL SELECT 3, 'Truck',    'Active'  FROM DUAL
UNION ALL SELECT 4, 'Truck',    'Defect'  FROM DUAL
UNION ALL SELECT 5, 'Airplane', 'Awesome' FROM DUAL
SELECT MIN( Record_ID ) KEEP ( DENSE_RANK FIRST ORDER BY DECODE( Status, 'Active', 1, 'Awesome', 2, 3 ) ) AS Record_ID,
       MIN( Status )    KEEP ( DENSE_RANK FIRST ORDER BY DECODE( Status, 'Active', 1, 'Awesome', 2, 3 ) ) AS Status
FROM   Product_Statuses
GROUP BY Product
HAVING SUM( DECODE( Status, 'Defect', 1, 0 ) ) = 0
ORDER BY RECORD_ID
| RECORD_ID |  STATUS |
|-----------|---------|
|         1 |  Active |
|         5 | Awesome |
查询1

CREATE TABLE Product_Statuses ( Record_ID, Product, Status ) AS
          SELECT 1, 'Car',      'Active'  FROM DUAL
UNION ALL SELECT 2, 'Car',      'Awesome' FROM DUAL
UNION ALL SELECT 3, 'Truck',    'Active'  FROM DUAL
UNION ALL SELECT 4, 'Truck',    'Defect'  FROM DUAL
UNION ALL SELECT 5, 'Airplane', 'Awesome' FROM DUAL
SELECT MIN( Record_ID ) KEEP ( DENSE_RANK FIRST ORDER BY DECODE( Status, 'Active', 1, 'Awesome', 2, 3 ) ) AS Record_ID,
       MIN( Status )    KEEP ( DENSE_RANK FIRST ORDER BY DECODE( Status, 'Active', 1, 'Awesome', 2, 3 ) ) AS Status
FROM   Product_Statuses
GROUP BY Product
HAVING SUM( DECODE( Status, 'Defect', 1, 0 ) ) = 0
ORDER BY RECORD_ID
| RECORD_ID |  STATUS |
|-----------|---------|
|         1 |  Active |
|         5 | Awesome |

CREATE TABLE Product_Statuses ( Record_ID, Product, Status ) AS
          SELECT 1, 'Car',      'Active'  FROM DUAL
UNION ALL SELECT 2, 'Car',      'Awesome' FROM DUAL
UNION ALL SELECT 3, 'Truck',    'Active'  FROM DUAL
UNION ALL SELECT 4, 'Truck',    'Defect'  FROM DUAL
UNION ALL SELECT 5, 'Airplane', 'Awesome' FROM DUAL
SELECT MIN( Record_ID ) KEEP ( DENSE_RANK FIRST ORDER BY DECODE( Status, 'Active', 1, 'Awesome', 2, 3 ) ) AS Record_ID,
       MIN( Status )    KEEP ( DENSE_RANK FIRST ORDER BY DECODE( Status, 'Active', 1, 'Awesome', 2, 3 ) ) AS Status
FROM   Product_Statuses
GROUP BY Product
HAVING SUM( DECODE( Status, 'Defect', 1, 0 ) ) = 0
ORDER BY RECORD_ID
| RECORD_ID |  STATUS |
|-----------|---------|
|         1 |  Active |
|         5 | Awesome |

我理解最后一行以及为什么它被排除在外。但是为什么第二行和第三行也被排除在外呢?谢谢你的关注。这是因为活动状态的权重大于awesome。嗨@Hatjhie,那么如果我们只有一个状态为awesome的产品,它是否应该显示在结果中?如果我们只有一个状态为awesome的产品,它是否应该显示在结果中?基于此,我将更改上述查询。谢谢!我得到了如何解决实际问题的灵感。如果样本数据在交换的前两行中具有
记录ID
(或
状态
),则不会返回正确的结果。