oracle SQL -如何从一个列中获取与另一个列中的条目唯一的不同值?

zc0qhyus  于 7个月前  发布在  Oracle
关注(0)|答案(3)|浏览(64)

我在一家生产微芯片的工厂工作。我们每批生产10,000个微芯片。其中一台处理微芯片批次的机器称为“分配”。有30台这样的“分配”机器-名为分配1,分配2,分配28等。
如果在处理微芯片时出现问题,这些机器通常会发出警报。不同的警报会被分配不同的“代码”。
因此,报警代码1可能是“关闭开关仍然打开”。报警代码2可能是“防护门仍然打开”等。
在一个理想的世界里,所有的配药机都应该有一套相同的报警代码,但事实并非如此。
例如,它们是分配1唯一的某些报警代码,不会出现在其他分配机器上。
报警数据被输入到名为“dispense_status”的表中,如下所示:
| 机|报警码|运行时间戳|批号|
| --|--|--|--|
| 分配_1| 1 |2019 -07- 21 14:32| 1000585855 |
| 分配_23| 4 |2019 -09- 21 12:34| 1000585856 |
| 分配_9| 7 |2019 -08- 21 13:33| 1000456789 |
| 分配_1| 2 |2019 -09- 21 15:00:00| 1000223774 |
| 分配_9| 2 |2018 -05- 21 12:34| 1000374590 |
在上表中,报警代码1是分配1的唯一代码。报警代码2也出现在分配1上,但它不是分配1的唯一代码,因为该alarm_code也出现在分配9上。
如果我写:

SELECT DISTINCT ALARM_CODE
FROM DISPENSE_STATUS
WHERE MACHINE = DISPENSE_1
ORDER BY ALARM_CODE

字符串
这将给我给予:
| 报警码|
| --|
| 1 |
| 2 |
但我只想要报警代码1,因为这是分配1唯一的报警代码。
(报警代码2也发生在分配9时)。
什么是SQL查询,以便给予分配1唯一的报警代码?

wqsoz72f

wqsoz72f1#

您可以使用HAVING子句来检查它是否在多台计算机上发生,并检查该事件是否仅限于该特定计算机:

SELECT alarm_code
FROM dispense_status
GROUP BY alarm_code
HAVING COUNT(DISTINCT machine) = 1 AND MAX(machine) = 'Dispense_1'
ORDER BY alarm_code;

字符串

rekjcdws

rekjcdws2#

使用带子查询的SQL查询将Dispense_1的报警代码与其他机器的报警代码进行比较:

SELECT DISTINCT ds1.ALARM_CODE
FROM DISPENSE_STATUS ds1
WHERE MACHINE = 'Dispense_1'
AND NOT EXISTS (
    SELECT 1
    FROM DISPENSE_STATUS ds2
    WHERE ds2.ALARM_CODE = ds1.ALARM_CODE
    AND ds2.MACHINE != 'Dispense_1'
);

字符串
我们从SELECT DISTINCT语句开始,检索Dispense_1的唯一报警代码。我们在子查询中使用NOT EXISTS检查具有相同报警代码但位于不同计算机上的任何其他记录(ds2)。如果没有此类记录,则意味着报警代码对于Dispense_1是唯一的。

cu6pst1q

cu6pst1q3#

一个有点被遗忘的特性,EXCEPT

SELECT ALARM_CODE FROM DISPENSE_STATUS WHERE MACHINE = 'DISPENSE_1'
EXCEPT
SELECT ALARM_CODE FROM DISPENSE_STATUS WHERE MACHINE <> 'DISPENSE_1'

字符串

相关问题