You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查询Product表中productId唯一的所有数据行?

问题:如何从Product表中检索productId唯一的完整数据行?

需求:过滤掉重复productId的行,返回包含productId、name、price等所有字段的唯一productId数据行,期望结果格式如下:

productID| name | price | ...
     1    |  ... |  ...  | ...
     2    |  ... |  ...  | ...
     3    |  ... |  ...  | ...

尝试过以下两种SQL,均无法实现需求:

SELECT DISTINCT `productId`  FROM `Product`

SELECT * 
FROM `Product` 
WHERE DISTINCT `productId`

可行解决方案

方案1:GROUP BY + 聚合函数(通用所有支持GROUP BY的数据库)

当同一productId对应的其他字段值一致时,此方法最直接。通过GROUP BY productId确保每个productId只返回一行,其他字段用聚合函数(如MAX()/MIN())提取对应值:

SELECT 
  productId,
  MAX(name) AS name,
  MAX(price) AS price,
  -- 其他字段按同样方式处理,根据业务选择MAX/MIN
FROM Product
GROUP BY productId;

如果同一productId下的其他字段存在不同值,需根据业务逻辑选择保留哪一个(比如用MAX()取最大的,MIN()取最小的)。

方案2:窗口函数ROW_NUMBER()(适用于MySQL 8.0+、PostgreSQL、SQL Server等)

如果需要精准控制保留重复productId中的某一行(比如最新创建的、价格最高的),用窗口函数更灵活:

SELECT productId, name, price, ...
FROM (
  SELECT 
    *,
    -- 按productId分组,每组内按创建时间倒序编号,最新的行编号为1
    ROW_NUMBER() OVER (PARTITION BY productId ORDER BY create_time DESC) AS rn
  FROM Product
) t
WHERE rn = 1;

修改ORDER BY后的字段可以指定保留的行(比如ORDER BY price DESC保留价格最高的行)。


为什么之前的SQL无效?

  • 第一个SQL仅返回唯一的productId字段,没有其他所需字段,不符合需求;
  • 第二个SQL语法错误,WHERE子句不能直接使用DISTINCT关键字。

内容的提问来源于stack exchange,提问作者Dugong98

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 17:45:42