使用聚合函数

时间:2016-09-05 03:36:20

标签: mysql sql group-by aggregate-functions

我有一张桌子:

         price
---------------------
        id | int (PK)
unit_price | number
   part_id | int (FK)
      line | int

part_idline上设置了一个唯一约束(因此部分可以通过"行&#34来区分多个价格;)

要想象:

id | unit_price | part_id | line
--------------------------------
 1 |     100.00 |       1 |    1
 2 |     150.00 |       1 |    2
 3 |      90.00 |       1 |    3
 --------------------------------
 4 |      75.00 |       2 |    1
 5 |      70.00 |       2 |    2
 --------------------------------
 6 |      90.00 |       3 |    1
 7 |      95.00 |       3 |    2

我需要编写一个查询,该查询将采用最低'行'对于每个部分并显示价格,因此输出将是:

id | unit_price | part_id | line
--------------------------------
 1 |     100.00 |       1 |    1
 4 |      75.00 |       2 |    1
 6 |      90.00 |       3 |    1

我从这个问题开始:

SELECT min(line), unit_price, part_id
FROM price
GROUP BY ... ?

但我很快意识到,如果我将unit_pricepart_id添加到GROUP BY子句中,那么它基本上会给我原始输出(所有内容),因为每个unit_price是独特的。但我不能GROUP BY part_id本身,因为unit_price条款需要包含GROUP BY

我是否应该使用汇总min函数仅为part_id选择一个行?我想我可能会用GROUP BY咆哮错误的树。我只在问题中提出它来展示我尝试过的事情。

在我的数据集中,并非所有价格都保证以' 1'开头,因此= 1条件不起作用。我需要最低限度。此外,我使用的是MySQL,但我认为这也许并不重要。

2 个答案:

答案 0 :(得分:2)

以下是使用join和使用min的子查询的常见方法:

select p.id, p.unit_price, p.part_id, p.line
from price p join (
    select part_id, min(line) as line
    from price
    group by part_id
    ) t on p.part_id = t.part_id and p.line = t.line 

答案 1 :(得分:0)

请使用以下查询

查询: -

select p1.* from price as p1
where p1.id = ( select p2.id from price as p2
                where p2.part_id = p1.part_id
                order by p2.line asc limit 0,1)
group by p1.id