2015-01-12 7 views
0

У меня есть таблица FixtureStatsподсчет количества высоких оценок дорожит

Id FixtureId PlayerID Rating other Attributes 
1  1    1  8.5 
2  1    2  6.8 
3  1    3  9.1 << man of the match(Motm) 
..... 
100  4    1  5.3 
101  4    2  7.6  << Motm 
102  4    3  4.5 

Я хочу, чтобы выбрать список игроков и количество Motm один Достигается.

Например.

PlayerId Motm 

    1   0 
    2   1 
    3   1 

Спасибо всем.

+0

Что определяет MOTM? Оно находится в поле Other Attributes? –

+0

MOTM - это тот, кто имеет лучший рейтинг в одном крепеже, как показано выше. Fixture 1: игрок 3 имеет самый высокий рейтинг ... –

+0

MOTM, похоже, является игроком, который набрал наибольшее значение в данном FixtureId –

ответ

3

Вы можете использовать функцию ROW_NUMBER() для этого:

;with cte AS (SELECT * 
        ,CASE WHEN ROW_NUMBER() OVER(PARTITION BY FixtureID ORDER BY Rating DESC) = 1 THEN 1 END AS Motm 
       FROM FixturStats 
      ) 
SELECT PlayerID 
     ,SUM(Motm) AS Motm 
FROM cte 
GROUP BY PlayerID 

Поскольку вы заботитесь только о Motm я завернул его в CASE так это либо 1 или NULL, а затем могут быть объединены просто. Если вы хотите посмотреть, как часто кто-то был вторым или третьим, вы можете удалить CASE и заполнить по-разному.

ROW_NUMBER() создает ряд для каждой строки в группе определяется PARTITION BY и пронумерованы в соответствии с ORDER BY, в этом случае, вы хотите, чтобы верхняя rating от каждого FixtureID, поэтому мы используем их.

+0

спасибо большое, мне нужно узнать больше о sql :) –

+1

Я принял ваш ответ для придумывания первой идеи. –

2

Вы можете использовать ROW_NUMBER():

WITH CTE AS(
    SELECT 
     *, 
     rn = ROW_NUMBER() OVER(PARTITION BY FixtureId ORDER BY Rating DESC) 
    FROM FixtureStats 
) 
SELECT 
    p.PlayerID, 
    Motm = COUNT(c.PlayerID) 
FROM (
    SELECT DISTINCT PlayerID FROM FixtureStats 
)p 
LEFT JOIN CTE c 
    ON c.PlayerID = p.PlayerID 
    AND c.rn = 1 
GROUP BY p.PlayerID 
Смежные вопросы