SQL 和分组查询

SQL and Group By query

我有 table material :

 - id: int
 - Product: varchar (100)
 - Content: text 
 - price: double

我想显示 materials 的列表,按产品分组显示最新价格 我试过:

 SELECT  * FROM materiel GROUP BY produit ORDER BY id

但是在我看来是一等奖的产品组

13, product1, dell, 25
14, product2, hp, 4 
17, product3, acer, 15 

不使用group by的查询

13, product1, dell, 25
14, product2, hp, 4 
16, product1, acer, 35
17, product3, acer, 15 

我想要这个节目

14, product2, hp, 4
16, product1, acer, 35 
17, product3, acer, 15 

您可以使用IN()语句:

SELECT * FROM product p
WHERE p.product,p.id IN(SELECT p1.product,max(p1.id)
                        FROM product p1
                        GROUP BY p1.product)

或者 JOIN:

SELECT p.* FROM product p
INNER JOIN (SELECT p1.product,max(p1.id) as max_id
            FROM product p1
            GROUP BY p1.product) p1
 ON(p.id = p1.max_id and p.product = p1.product)
SELECT  m.* 
FROM materiel m
LEFT JOIN materiel m1
ON m.produit  = m1.produit 
  AND m.id<m1.id
WHERE m1.id IS NULL

一种方法使用相关子查询:

select m.*
from material m
where m.id = (select max(m2.id) from material m2 where m2.product = m.product);

我更喜欢这种方法,因为子查询可以利用 material(product, id) 上的索引,因此它比聚合方法更快。此外,如果您有其他条件(比如 price > 100),那么这应该会更快。

或者,在SQL服务器中,典型的方式使用row_number():

select m.*
from (select m.*,
             row_number() over (partition by product order by id desc) as seqnum
      from material m
     ) m
where seqnum = 1;