2015-11-05 218 views
0

我有一個問題,所有的SQL專家。SQL查詢和子查詢

有表看起來像:

clanname country  points 
name1  country1 100 
name2  country1 90 
name3  country1 10 
name4  country2 100 
name5  country2 80 
name6  country2 70 

我想作一個國家的排名只涉及每個國家的前2項結果。所以,在這個例子中,排名應該是:

country average-points 
country2 95 
country1 90 

如果有一種方式來獲得這個結果與使用子查詢只有一個SQL查詢?

在現實中,我有超過200個國家..和成千上萬的結果爲每個國家。但我只想過濾每個國家的前30個結果。

現在我設法得到一個國家的使用此查詢平均:

SELECT 
     location, AVG(warswon) 
    FROM 
     (SELECT 
      `name`, `location`, `warswon` 
     FROM 
      `clans` 
     WHERE 
      location = 'China' 
     ORDER BY 
      `clans`.`warswon` DESC 
     LIMIT 30) AS top30ofcountry 

,但我怎麼得到每個國家的平均結果在一個查詢?

這可能嗎?

+0

GROUP BY [字段名] –

+0

末'GROUP BY添加location' – Mihai

+0

爲什麼你需要爲這個子查詢? –

回答

2

這是每組問題。這在許多數據庫中使用row_number是微不足道的。在MySQL中,你可以使用用戶變量來做到這一點

SELECT 
    country , 
    avg(points) 
FROM 
(
    SELECT 
     @num := if(@group = `country`, @num + 1, 1) as row_number, 
     @group := `country` as dummy, 
     clanName, 
     country, 
     points 
    FROM 
     clans 
     JOIN (SELECT @group := NULL, @num := 0) as z 
    order by 
     country, points desc) as x 
WHERE x.row_number <=2 
GROUP BY 
    country 
+0

好康拉德..我有這種感覺接近我需要的查詢。我使用mysql和以前的帖子的所有GROUP BY提案都沒有幫助。 –

0

感謝您的幫助康拉德。 我設法得到reqested結果只是稍微改變你提出的代碼。 這裏是爲那些誰也有類似的問題,最終的工作查詢:

SELECT 
location, 
avg(warswon) 
FROM 
(
SELECT 
@num := if(@group = `location`, @num + 1, 1) as row_number, 
@group := `location` as dummy, 
name, 
location, 
warswon 
FROM 
clans 
JOIN (SELECT @group := NULL, @num := 0) as z 
order by 
location, warswon desc 
) as x 
WHERE x.row_number <= 30 
GROUP BY `location` 
ORDER BY avg(warswon) DESC