为什么在使用MIN函数并选择另一列时,我们需要GROUP BY子句? MIN不返回单条记录吗?

时间:2018-07-03 14:47:18

标签: sql postgresql

我有两个表vehiclesdealership_vehiclesdealership_vehicles表具有价格列。 vehicles表中的列dealership_vehicle_iddealership_vehicles表中的dealership_vehicles id列有关。

我只想退货最便宜的汽车。

为什么查询以下内容:

select 
    vehicles.make, 
    MIN(dealership_vehicles.price) 
from 
    vehicles inner join dealership_vehicles 
    on vehicles.dealership_vehicle_id=dealership_vehicles.id;

返回错误:

column "vehicles.make" must appear in the GROUP BY clause or be used in an aggregate function

由于MIN函数返回单个值,因此可以构造不需要返回GROUP BY即可返回单个值的SQL查询。

4 个答案:

答案 0 :(得分:1)

将术语“ GROUP BY”理解为“ for each”。就是说“给我每辆车的makeupship_vehicles.price的最小值。制造”

因此,您需要将查询更改为:

select 
    vehicles.make, 
    MIN(dealership_vehicles.price) 
from 
    vehicles inner join dealership_vehicles 
    on vehicles.dealership_vehicle_id=dealership_vehicles.id
Group by vehicles.make;

答案 1 :(得分:1)

您说您想知道最便宜的汽车的品牌。最简单的方法是

SELECT DISTINCT v.MAKE
  FROM VEHICLE v
  INNER JOIN DEALERSHIP_VEHICLES dv
    ON v.DEALERSHIP_VEHICLE_ID = dv.ID
  WHERE dv.PRICE = (SELECT MIN(PRICE) FROM DEALERSHIP_VEHICLES);

请注意,由于多种车辆的价格可能是“最便宜的”,因此您完全有可能从上述查询中获得多次回报。

好运。

编辑

另一种方法是按照制造商的价格选择最低价格,然后按最低价格排序,然后仅取第一行。像

SELECT *
  FROM (SELECT v.MAKE, MIN(dv.PRICE)
          FROM VEHICLE v
          INNER JOIN DEALERSHIP_VEHICLES dv
            ON v.DEALERSHIP_VEHICLE_ID = dv.ID
          GROUP BY v.MAKE
          ORDER BY MIN(dv.PRICE) ASC)
  WHERE ROWNUM = 1;

答案 2 :(得分:0)

如果您想要制造最便宜的汽车,则无需汇总:

select v.make, dv.price
from vehicles v inner join
     dealership_vehicles  dv
     on v.dealership_vehicle_id = dv.id
order by dv.price asc
fetch first one row only;

如果要在平局的情况下需要所有行,这会变得更加复杂:

select v.*
from (select v.make, dv.price, rank() over (order by price asc) as seqnum
      from vehicles v inner join
           dealership_vehicles  dv
           on v.dealership_vehicle_id = dv.id
     ) v
where seqnum = 1

答案 3 :(得分:0)

因此,假设加入价格后,我们有下表(即存储在#temp表中):

#temp Vehicles table:
| Make   | Model |    Price |
|--------|-------|----------|
| Toyota | Yaris |  5000.00 |
| Toyota | Camry | 10000.00 |
| Ford   | Focus |  7500.00 |

如果在不指定分组依据的情况下查询最低价格,则所有行仅应用一个最低功能。示例:

select min(Price) from #temp

将为您返回5000.00的单个值

如果您想知道最便宜的汽车的制造商,则需要以最便宜的价格过滤结果-这是一个两步过程。首先,您使用min找出最便宜的价格,然后在单独的查询中找出该价格下的哪些汽车。正确构建查询后,您会发现这揭示了您可能没有的东西-实际上,您可以拥有多个最便宜的商品。

示例表:

#temp Vehicles table v2:
| Make   | Model  |    Price |
|--------|--------|----------|
| Toyota | Yaris  |  5000.00 |
| Toyota | Camry  | 10000.00 |
| Ford   | Focus  |  7500.00 |
| Ford   | Escort |  5000.00 |

查询:

select * from #temp
where Price = (select min(Price) from #temp)

结果:

| Make   | Model  |    Price |
|--------|--------|----------|
| Toyota | Yaris  |  5000.00 |
| Ford   | Escort |  5000.00 |