钟二网络头像

钟二网络

探索SQL查询技巧、Linux系统运维以及Web开发前沿技术,提供一站式的学习体验

  • 文章92531
  • 阅读1274548
首页 SQL 正文内容

sql去重选择第一个

钟逸 SQL 2025-03-20 01:38:13 32

在 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。

文章目录
    搜索