我得到了一个面试问题,其中有一个以DB为模型的汽车销售。每个Car
代表汽车销售中的实体汽车,其指的是Make
和Model
表。 Sale
表会跟踪已售出的每个Car
。 Sale
只包含一个Car
,因此每个已售出的唯一Sale
Car
都有一条记录。
问题是找出汽车销售中售出最多的Model
的名称。我回答了3级嵌套查询。面试官特别要求使用连接的解决方案,我只是成功地加入了没有聚合的表。
如何在使用其他两个聚合时加入3个表格(Car,Make,Sale)?
这是架构的草图。这里卖得最多的Model
应该返回'Corolla'
Car
| carid| modid | etc...
_________________
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 2 |
Make
| mkid | name |
_________________
| 1 | Toyota |
| 2 | Nissan |
| 3 | Chevy |
| 4 | Merc |
| 5 | Ford |
Model
| modid| name | mkid |
________________________
| 1 | Corolla| 1
| 2 | Sunny | 2
| 3 | Carina | 1
| 4 | Skyline| 2
| 5 | Focus | 5
Sale
| sid | carid | etc...
_________________
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
编辑:
使用MS SQL Server 2008
需要输出:
Model Name | Count
_____________________
Corolla | 3
即。已售出最多的Car
模型。
请注意,Car
表中只有3个Corollas和2个Sunnys,而Sale
表对应于其他每个销售详细信息。 5 Sale
个记录实际上是Corolla,Corolla,Corolla,Sunnnu和Sunny。
答案 0 :(得分:3)
由于您使用的是SQL Server 2008
,请使用Common Table Expression
和Window Function
。
WITH recordList
AS
(
SELECT c.name, COUNT(*) [Count],
DENSE_RANK() OVER (ORDER BY COUNT(*) DESC) rn
FROM Sale a
INNER JOIN Car b
ON a.carid = b.carID
INNER JOIN Model c
ON b.modID = c.modID
GROUP BY c.Name
)
SELECT name, [Count]
FROM recordList
WHERE rn = 1
答案 1 :(得分:2)
当面试官要求这样做时,他们通常会要求你说你使用了窗口功能。您可以为每个销售分配一个按模型划分的唯一升序号码,您获得的最高销售数量将是最大数量。
http://www.postgresql.org/docs/9.1/static/tutorial-window.html
答案 2 :(得分:2)
基于您新添加的SQL Server 2008标记。如果您使用的是其他RDBMS,则可能需要使用limit
而不是top
,并将其放在top_sold_car
子查询的末尾。
select Make.name as Make, Model.name as Model
from (
select top 1 count(*) as num_sold
from Car
group by modid
order by num_sold desc) as top_sold_car
join Model
on (top_sold_car.modid = Model.modid)
join Make
on (Model.mkid = Make.mkid)
答案 3 :(得分:2)
以下查询适用于oracle 11g。这是fiddle link
SELECT name FROM (
SELECT model.name AS name FROM car , sale , model
WHERE car.carid=sale.carid
AND car.modid=model.modid
GROUP BY model.name
ORDER BY count(*) DESC )
WHERE rownum = 1;
或者
SELECT name FROM (
SELECT model.name AS name FROM car natural join sale natural join model
GROUP BY model.name
ORDER BY count(*) DESC )
WHERE rownum = 1;
<强>输出强>
| NAME |
-----------
| Corolla |