You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

查询优化(排序):基于Results_Race表的车手排序查询优化

Optimizing the Driver Ranking Query for Results_Race Table

Hey there! Let’s work through optimizing this query together. First, I’ll assume the standard tiebreaker logic for racing rankings since your description cut off—feel free to adjust if your actual rules differ:

  • Primary sort: Descending count of 1st place finishes (Positions = 1)
  • Tiebreaker 1: Descending count of 2nd place finishes (Positions = 2)
  • Tiebreaker 2: Descending count of 3rd place finishes (Positions = 3)
  • ... and so on for lower positions

Common Inefficient Query (What You Might Be Using)

If you’re relying on subqueries to calculate each position count separately, that’s likely causing slow performance. Here’s an example of that approach:

SELECT 
    "Driver names" AS driver_name,
    (SELECT COUNT(*) FROM Results_Race rr2 WHERE rr2."Driver names" = rr1."Driver names" AND rr2.Positions = 1) AS first_places,
    (SELECT COUNT(*) FROM Results_Race rr2 WHERE rr2."Driver names" = rr1."Driver names" AND rr2.Positions = 2) AS second_places,
    (SELECT COUNT(*) FROM Results_Race rr2 WHERE rr2."Driver names" = rr1."Driver names" AND rr2.Positions = 3) AS third_places
FROM Results_Race rr1
GROUP BY "Driver names"
ORDER BY first_places DESC, second_places DESC, third_places DESC;

This runs a separate subquery for every driver and position, leading to repeated full table scans—total performance killer.

Optimized Query

Switch to conditional aggregation to calculate all position counts in a single pass over the table. This cuts down on unnecessary table scans drastically:

SELECT 
    "Driver names" AS driver_name,
    COUNT(CASE WHEN Positions = 1 THEN 1 END) AS first_places,
    COUNT(CASE WHEN Positions = 2 THEN 1 END) AS second_places,
    COUNT(CASE WHEN Positions = 3 THEN 1 END) AS third_places
    -- Add more CASE statements for lower positions if needed
FROM Results_Race
GROUP BY "Driver names"
ORDER BY first_places DESC, second_places DESC, third_places DESC;

If you don’t need to display the counts and only care about sorting, you can simplify further:

SELECT "Driver names" AS driver_name
FROM Results_Race
GROUP BY "Driver names"
ORDER BY 
    COUNT(CASE WHEN Positions = 1 THEN 1 END) DESC,
    COUNT(CASE WHEN Positions = 2 THEN 1 END) DESC,
    COUNT(CASE WHEN Positions = 3 THEN 1 END) DESC;

Extra Optimization Tips

  • Add a Composite Index: Create an index on ("Driver names", Positions) to speed up grouping and conditional counting. This lets the database quickly locate all positions for each driver without scanning the entire table:
    CREATE INDEX idx_driver_position ON Results_Race("Driver names", Positions);
    
  • Clean Up Column Names: Rename Driver names to driver_name (no spaces) so you don’t have to use quoted identifiers—this is cleaner and avoids syntax headaches.
  • Filter Early: If you only care about specific races (e.g., a season range), add a WHERE clause to reduce the number of rows processed before aggregation:
    SELECT "Driver names" AS driver_name
    FROM Results_Race
    WHERE race_id BETWEEN 100 AND 200 -- Example filter for a specific season
    GROUP BY "Driver names"
    ORDER BY 
        COUNT(CASE WHEN Positions = 1 THEN 1 END) DESC,
        COUNT(CASE WHEN Positions = 2 THEN 1 END) DESC;
    

If your tiebreaker rule is different (like total points instead of lower position counts), just adjust the ORDER BY clauses to match your exact needs. Share your original query if you want a more tailored tweak!

内容的提问来源于stack exchange,提问作者ninjarp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 06:17:54