我有一張桌子,看起來像這樣:
飛機 | 作業指示 | 工程訂單 | 描述 | 零件編號 | 機構位置 |
---|---|---|---|---|---|
KHB | 21 | 45 | 發動機 1 | pw123 | E1 |
KHB | 21 | 45 | 發動機 4 | pw123 | E2 |
KHB | 22 | 45 | 發動機 2 | pw122 | E1 |
知識庫 | 31 | 55 | 轉子發動機 | v123 | E2 |
知識庫 | 36 | 51 | 發動機 9 | v156 | E1 |
知識庫 | 31 | 55 | 發動機補償 | v123 | E1 |
我只需要選擇在WorkOrder、EngOrder 和 PartNO中相似但在InstPosition中不同的行。我的結果表應如下所示:
飛機 | 作業指示 | 工程訂單 | 描述 | 零件編號 | 機構位置 |
---|---|---|---|---|---|
KHB | 21 | 45 | 發動機 1 | pw123 | E1 |
KHB | 21 | 45 | 發動機 4 | pw123 | E2 |
知識庫 | 31 | 55 | 轉子發動機 | v123 | E2 |
知識庫 | 31 | 55 | 發動機補償 | v123 | E1 |
我嘗試使用自聯接,但它回傳空表:
SELECT a.*
FROM table a
INNER JOIN b ON a.WorkOrder = b.WorkOrder
AND a.EngOrder = b.EngOrder
AND a.PartNO = b.PartNO
AND a.InstPosition != b.InstPosition ```
uj5u.com熱心網友回復:
你不需要加入。
這個:
我只需要選擇在 WorkOrder、EngOrder 和 PartNO 中相似但在 InstPosition 中不同的行。
對我來說,聲音就像在視窗中計算不同的 InstPosition。
select
Aircraft,
WorkOrder,
EngOrder,
Description,
PartNo,
InstPosition
from
(
select
Aircraft,
WorkOrder,
EngOrder,
Description,
PartNo,
InstPosition,
count(distinct InstPosition) over(partition by WorkOrder, EngOrder , PartNO) as dist_cnt
from a
)
where dist_cnt > 1
;
uj5u.com熱心網友回復:
我只需要選擇在 WorkOrder、EngOrder 和 PartNO 中相似但在 InstPosition 中不同的行。
你基本上可以按照你用英語表達的方式來做到這一點。查找至少有另一行具有相同 WorkOrder、EngOrder 和 PartNo 但不同 InstPosition 的任何行。
以下是將其轉換為 SQL 的方法:
SELECT t.*
FROM your_table t
WHERE EXISTS ( SELECT 'similar record'
FROM your_table t2
WHERE t2.WorkOrder = t.WorkOrder
AND t2.EngOrder = t.EngOrder
AND t2.PartNo = t.PartNo
-- simple logic below assumes InsPosition is NOT NULL
AND t2.InstPosition <> t.InstPosition
)
uj5u.com熱心網友回復:
我們可以在這里使用聚合方法
WITH cte AS (
SELECT WorkOrder, EngOrder, PartNO
FROM yourTable
GROUP BY WorkOrder, EngOrder, PartNO
HAVING MIN(InstPosition) <> MAX(InstPosition)
)
SELECT t1.*
FROM yourTable t1
INNER JOIN cte t2
ON t2.WorkOrder = t1.WorkOrder AND
t2.EngOrder = t1.EngOrder AND
t2.PartNO = t1.PartNO;
CTE 查找所有具有WorkOrder
、EngOrder
和 且PartNO
至少具有 2 個不同InstPosition
值的元組。然后外連接過濾原始表。
uj5u.com熱心網友回復:
您可以為此目的使用以下解決方案:
SELECT Aircraft, WorkOrder, EngOrder, Description, PartNo, InstPosition
FROM (
SELECT t1.*, COUNT(DISTINCT InstPosition)OVER(PARTITION BY WorkOrder, EngOrder, PartNo)cnt
FROM Your_Table t1
) t2
WHERE cnt > 1
ORDER BY WorkOrder, EngOrder, PartNo
;
演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/506864.html
標籤:sql 甲骨文 oracle-sqldeveloper