Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-查询-选择最佳汽车数量_Sql_Oracle - Fatal编程技术网

SQL-查询-选择最佳汽车数量

SQL-查询-选择最佳汽车数量,sql,oracle,Sql,Oracle,假设您有以下表格: TABLE Car car_id num TABLE Car_description dsc_id car_id model TABLE Result res_id car_id race_num result 我们的任务是为超过2辆车的比赛选择最大平均分数,并为最佳汽车选择Car.num、Car\u description.model。我编写了以下查询 SELECT race_num, MAX(result), AVG(result), STDDEV(result)

假设您有以下表格:

TABLE Car
car_id
num

TABLE Car_description
dsc_id
car_id
model

TABLE Result
res_id
car_id
race_num
result
我们的任务是为超过2辆车的比赛选择最大平均分数,并为最佳汽车选择Car.num、Car\u description.model。我编写了以下查询

SELECT 
race_num,
MAX(result),
AVG(result),
STDDEV(result)
FROM Result r, Car c, Car_description d
WHERE c.car_id = r.car_id AND d.car_id = c.car_id
HAVING COUNT(result) > 2
GROUP BY r.race_num

但我不明白-如何为每一场比赛选择最好的车号和车型?谢谢。

我假设汽车id是从汽车到汽车描述的1-1映射

下面的查询使用row_number()根据分数获取顶级汽车。此信息可能已经出现在“结果”中


这一点的关键是分组方式,有条件地选择有关顶级车的信息。

谢谢。一个问题。这里所有种族的排序“ROW_NUMBER()over(按种族的划分顺序按分数描述)作为seqnum”将是无效的,也许还有其他方法,在这里只选择max元素,而不是对所有种族进行排序。@AlexHoppus。你说的无效是什么意思?目的是确定得分最高的汽车,这可能是“最佳”(原始问题没有定义“最佳”)。结果可能包含此信息,或者对于最佳汽车,结果=1。在这种情况下,不需要行号。@AlexHoppus。它不应该比GROUPBY更耗时(因此查询应该大致相当于执行两个GROUPBY)。但是,性能取决于许多因素——服务器、数据的分区方式、数据库的配置方式等等。您想发布另一个关于性能的问题吗?
select r.race_num,
       MAX(score) as MaxScore,
       AVG(score) as AvgScore,
       MAX(case when seqnum = 1 then c.carnum end) as TopCarNum,
       MAX(case when seqnum = 1 then cd.model end) as TopCarModel
from (select r.*,
             ROW_NUMBER() over (partition by race_num order by score desc) as seqnum
      from Result r
     ) r left outer join
     Car c
     on c.car_id = r.car_id left outer join
     Car_Description cd
     on c.car_id = d.car_id
group by r.race_num
having COUNT(*) > 2