首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL 依名稱分組並僅顯示最低價格記錄

     編輯:關於SqlServer

問題描述

在 MySQL 中,假設有一張商品表 table1,包含 id(主鍵)、name(商品名稱)和 price(價格)三個欄位。表中存在相同名稱但不同價格的記錄,需求是按名稱分組,每組只保留價格最低的那一筆記錄。

建表與測試資料

CREATE TABLE table1 (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50),
    price FLOAT DEFAULT 0
);

INSERT INTO table1 (name, price) VALUES
('玉米', 10), ('大米', 20), ('小麥', 30), ('西瓜', 40),
('玉米', 15), ('大米', 16), ('小麥', 35), ('西瓜', 36);

解決方案

使用 GROUP BY 搭配聚合函數 MIN() 即可輕鬆實現:

SELECT name, MIN(price) AS min_price
FROM table1
GROUP BY name
ORDER BY min_price;

執行結果

namemin_price
玉米10
大米16
小麥30
西瓜36

進階:若需保留完整欄位(含 id)

若需要顯示對應的 id 或其他欄位,可使用子查詢或視窗函數(MySQL 8.0+):

-- 方法一:子查詢(適用於所有版本)
SELECT t1.*
FROM table1 t1
JOIN (
    SELECT name, MIN(price) AS min_price
    FROM table1
    GROUP BY name
) t2 ON t1.name = t2.name AND t1.price = t2.min_price;

-- 方法二:ROW_NUMBER() 視窗函數(MySQL 8.0+)
WITH ranked AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY name ORDER BY price) AS rn
    FROM table1
)
SELECT id, name, price
FROM ranked
WHERE rn = 1;

小結

  • 單純取得「每組最小值」時,GROUP BY + MIN() 最簡潔。
  • 需保留完整記錄時,建議用子查詢或視窗函數。
  • 注意:若同組有相同最低價,上述方法會返回多筆;若只要一筆,可在 ORDER BY 加上 id 作為第二排序鍵。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved