在 SQL 中,经常需要从数据集中的重复数据中选择唯一的记录。其中一种 是使用 DISTINCT 关键字,它可以返回一个不重复记录的 。
然而,在某些情况下,我们可能不仅需要去重,还希望选择每个重复组中的第一个记录。这可以通过使用 MIN() 函数和 OVER 子句实现。
MIN() 函数
MIN() 函数用于返回一组值中的最小值。当与 OVER 子句结合使用时,它可以根据指定的分组条件确定每个组的最小值。
例如,假设我们有一个表 orders ,其中包含以下字段:
sql
| order_id | product_id | quantity |
|---|---|---|
| 1 | 100 | 1 |
| 2 | 100 | 2 |
| 3 | 101 | 1 |
| 4 | 101 | 3 |
如果我们想选择每个产品 ID 的第一个订单,我们可以使用以下查询:
sql
SELECT order_id
FROM orders
GROUP BY product_id
ORDER BY MIN(order_id) OVER (PARTITION BY product_id);
OVER 子句
OVER 子句用于指定一个窗口框架,它定义了 MIN() 函数应该在哪些行的范围内操作。
在上面的示例中, PARTITION BY product_id 子句创建了一个窗口框架,将行分为不同的组,每个组对应一个唯一的 product_id 值。
MIN(order_id) OVER (PARTITION BY product_id) 表达式计算每个组中 order_id 的最小值。最后, ORDER BY 子句根据该最小值对结果进行排序,从而选择每个组中的第一个订单。
因此,执行上面的查询将返回以下结果:
sql
| order_id |
|---|---|
| 1 |
| 3 |
这表示产品 ID 为 100 的第一个订单是 order_id 为 1,而产品 ID 为 101 的第一个订单是 order_id 为 3。