我正在编辑【oracle】代码,遇到了 【同一histdate和eqpid在union all时如何只保留一条】 ,请帮我检查并改正错误点。我的原始代码如下: 【SELECT histdate,eqpid,runwip,move FROM( SELECT histdate , eqpid ,Sum(componentqty) runwip ,0 move FROM( SELECT histdate||'00' histdate ,eqpid,componentqty FROM sdb_tb_info_wip_hourly_ii_miu WHERE eqpid IN('EWFPR01','EWFPR02','EWFPR03','EWFPR05','EWFPR06','EWFPR07','EWRCA09','FWFPR01','FWFPR02','FWFPR03','FWFPR05','FWFPR06','FWRCA81','UWFPR71') AND adstatus ='Running' and lottype NOT IN ('C', 'D', 'Z', 'V', 'Y') AND lotid LIKE 'E%' AND histdate>To_Char(SYSDATE-7.5/24-1,'YYYYMMDD') ||' 07' ) GROUP BY histdate , eqpid UNION ALL SELECT histdate , eqpid ,Sum(componentqty) runwip ,0 move FROM( SELECT To_Char(updatetime,'yyyymmdd hh24')||'30' histdate ,eqpid,componentqty FROM mfg_tbl_info_wip_hourly_ii WHERE eqpid IN('EWFPR01','EWFPR02','EWFPR03','EWFPR05','EWFPR06','EWFPR07','EWRCA09','FWFPR01','FWFPR02','FWFPR03','FWFPR05','FWFPR06','FWRCA81】
时间: 2025-05-20 12:20:12 浏览: 10
在 Oracle SQL 中,`UNION ALL` 是一种用于合并两个或多个 `SELECT` 查询结果的操作符。然而,`UNION ALL` 不会对结果集进行去重操作。如果需要避免重复的 `histdate` 和 `eqpid` 组合并仅保留一条记录,可以结合使用 `ROW_NUMBER()` 或者 `DISTINCT` 来实现。
以下是具体的解决方案:
### 使用 ROW_NUMBER() 实现去重
可以通过窗口函数 `ROW_NUMBER()` 对每一组 `histdate` 和 `eqpid` 进行编号,并筛选出每组的第一条记录。
```sql
WITH RankedData AS (
SELECT
histdate,
eqpid,
other_column1,
other_column2,
ROW_NUMBER() OVER(PARTITION BY histdate, eqpid ORDER BY histdate DESC) AS rn
FROM (
SELECT histdate, eqpid, column1 AS other_column1, column2 AS other_column2
FROM table1
UNION ALL
SELECT histdate, eqpid, column3 AS other_column1, column4 AS other_column2
FROM table2
) CombinedData
)
SELECT histdate, eqpid, other_column1, other_column2
FROM RankedData
WHERE rn = 1;
```
上述代码中:
- 首先通过 `UNION ALL` 合并来自 `table1` 和 `table2` 的数据。
- 然后利用 `ROW_NUMBER()` 函数对每个唯一的 `(histdate, eqpid)` 组合分配一个序号,按指定顺序排列(此处按照 `histdate DESC` 排序)[^2]。
- 最终选择每组的第一个记录 (`rn = 1`)。
---
### 使用 DISTINCT 去重
另一种方式是直接使用 `DISTINCT` 关键字来去除重复项。不过需要注意的是,`DISTINCT` 只能作用于整个查询的结果集,因此适用于简单的场景。
```sql
SELECT DISTINCT histdate, eqpid, MAX(other_column1), MAX(other_column2)
FROM (
SELECT histdate, eqpid, column1 AS other_column1, column2 AS other_column2
FROM table1
UNION ALL
SELECT histdate, eqpid, column3 AS other_column1, column4 AS other_column2
FROM table2
) CombinedData
GROUP BY histdate, eqpid;
```
此方法中:
- 将两表的数据通过 `UNION ALL` 合并。
- 利用 `DISTINCT` 结合聚合函数(如 `MAX()`),确保对于相同的 `histdate` 和 `eqpid` 组合只返回唯一的一条记录[^3]。
---
### 性能考虑
当数据量较大时,推荐优先使用基于 `ROW_NUMBER()` 的方案,因为它提供了更灵活的选择条件(例如可以根据时间戳或其他字段决定保留哪一条)。而 `DISTINCT` 方法虽然简单直观,但在某些复杂情况下可能效率较低。
---
#### 相关问题
阅读全文
相关推荐









