0


Oracle SQL:多字段组合去重技巧详解

在 Oracle 数据库中,如果你需要根据多个字段的组合进行去重,最常用的几种方法是使用

DISTINCT

关键字、

GROUP BY

子句,或者使用窗口函数

ROW_NUMBER()

1. 使用

DISTINCT

关键字

如果想要获取所有唯一的记录组合,可以使用

DISTINCT

关键字。这将返回指定列的唯一组合。

SELECT DISTINCT column1, column2, ..., columnN
FROM table_name;

例如,如果有一个

orders

表,包含

customer_id

,

product_id

, 和

order_date

字段,可以这样查询:

SELECT DISTINCT customer_id, product_id, order_date
FROM orders;

2. 使用

GROUP BY

子句

GROUP BY

子句通常用于聚合函数,但也可以用于去重。可以选择你想要去重的字段,然后使用

MIN()

MAX()

函数(或其他聚合函数)来返回每个组的一个代表值。

SELECT column1, column2, ..., columnN
FROM table_name
GROUP BY column1, column2, ..., columnN;

这种方法的缺点是,它只返回每组的一个记录,但并不保证是哪个记录。如果想确保返回的是特定的记录(例如,最早的或最新的),可以结合子查询使用

MIN()

MAX()

函数。

SELECT t1.*
FROM table_name t1
JOIN (
  SELECT column1, column2, ..., columnN, MIN(id) AS min_id
  FROM table_name
  GROUP BY column1, column2, ..., columnN
) t2
ON t1.column1 = t2.column1 AND
   t1.column2 = t2.column2 AND
   ... AND
   t1.columnN = t2.columnN AND
   t1.id = t2.min_id;

3. 使用窗口函数

ROW_NUMBER()
ROW_NUMBER()

是一个窗口函数,可以为每一行分配一个唯一的数字,根据你提供的排序规则。可以使用它来选择每个组的第一行。

WITH RankedData AS (
  SELECT column1, column2, ..., columnN,
         ROW_NUMBER() OVER (PARTITION BY column1, column2, ..., columnN ORDER BY some_column) AS rn
  FROM table_name
)
SELECT column1, column2, ..., columnN
FROM RankedData
WHERE rn = 1;
some_column

可以是你希望用来决定哪个记录应该被选中的任何列。

选择哪种方法取决于你的具体需求和数据集的大小。

DISTINCT

最直观,在大数据集上可能效率较低。

GROUP BY

ROW_NUMBER()

更适合大型数据集,但需要更复杂的查询结构。

标签: 经验分享 oracle

本文转载自: https://blog.csdn.net/kiingking/article/details/140462603
版权归原作者 king-agic 所有, 如有侵权,请联系我们删除。

“Oracle SQL:多字段组合去重技巧详解”的评论:

还没有评论