SQL - Как я могу достичь матрицы? - PullRequest
0 голосов
/ 27 мая 2018

Я относительно новичок в SQL и впечатлил себя, просто добравшись до вывода ниже.

Столбцы «HomeTeamSequence» и «AwayTeamSequence» являются последними двумя результатами для домашней команды и команды гостей соответственно.«FTR» - фактический результат этого конкретного совпадения.

   with games as (

   SELECT t.Div, t.Date, t.HomeTeam, t.AwayTeam, t.FTHG, t.FTAG, t.FTR, 
   t.MatchID, U.team_id
   FROM All_Games.[dbo].[All_Games_Full] t 
   cross apply (values(HomeTeam), (AwayTeam)) as u(team_id)

    ), 

    games_update as (

    select *, 
    case when HomeTeam = team_id and FTR = 'H' then 'HW'
         WHEN HomeTeam = team_id and FTR = 'D' then 'HD'
         WHEN HomeTeam = team_id and FTR = 'A' then 'HL'
         when AwayTeam = team_id and FTR = 'A' then 'AW'
         WHEN AwayTeam = team_id and FTR = 'D' then 'AD'
         WHEN AwayTeam = team_id and FTR = 'H' then 'AL'
         ELSE NULL END NewFTR
    from games

    ), seq as (

    select MatchID, Div, Date, team_id,
    concat(case when LAG(team_id,2) over (order by team_id, Date) != team_id then null else LAG(NewFTR, 2) OVER (ORDER BY team_id, Date) end, ' ' ,
    case when LAG(team_id,1) over (order by team_id, Date) != team_id then null else LAG(NewFTR, 1) OVER (ORDER BY team_id, Date) end) as lastgame,
    NewFTR AS latestgame
    from games_update

    )

    select a.MatchID, a.Div, a.Date, a.HomeTeam, a.AwayTeam,
    case when a.HomeTeam = b.team_id then b.lastgame end HomeTeamSequence,
    case when a.AwayTeam = c.team_id then c.lastgame end AwayTeamSequence, 
    a.FTR
    from All_Games.[dbo].[All_Games_Full] a
    left join  seq b
    on a.MatchID = b.MatchID and a.HomeTeam = b.team_id
    left join seq c
    on a.MatchID = c.MatchID and a.AwayTeam = c.team_id
    where a.Div = 'SP1'
    ORDER BY MatchID

пример вывода:

MatchID Div    Date     HomeTeam    AwayTeam   HomeTeamSequence    AwayTeamSequence    FTR
135038  SP1 1995-10-01  La Coruna   Albacete    HW AD              AL HW        H
135039  SP1 1995-10-01  Merida      Salamanca   HL AL              AL HD        D
135040  SP1 1995-10-01  Oviedo      Betis       AW HD              AW HD        A
135041  SP1 1995-10-01  Sevilla     Ath Madrid  HW AD              AW HW        D
135042  SP1 1995-10-01  Valladolid  Tenerife    HD AD              AD HD        H
135043  SP1 1995-10-01  Vallecano   Valencia    HL AL              AW HD        H
135044  SP1 1995-10-01  Zaragoza    Compostela  HL AD              AD HW        H
135045  SP1 1995-10-04  Albacete    Valladolid  HW AL              AD HW        H
135046  SP1 1995-10-04  Barcelona   Oviedo      HW AD              HD HL        H 

Что я пытаюсь достичь, это следующая матрица (просто образецкомбинации заголовок / строка).Сосредоточив внимание на 'FTR' = 'H':

AD AD    AD AL   AD AW   AD HD   AD HL
AD AD   0       0       0       0       0
AD AL   0       0       0       0       0
AD AW   0       0       0       0       0
AD HD   3       0       1       1       1
AD HL   1       2       3       2       2
AD HW   1       3       3       1       1
AL AD   0       0       0       0       0
AL AL   0       0       0       0       0 

Я добавил следующее в вышеупомянутый запрос, чтобы проверить несколько комбинаций, но он не выглядит близко.

    select
    case when HomeTeamSequence = 'HW HW' THEN COUNT(*) else 0 END 'HW HW',
    case when HomeTeamSequence = 'HW HD' THEN COUNT(*) else 0 END 'HW HD',
    case when HomeTeamSequence = 'HW HL' THEN COUNT(*) else 0 END 'HW HL',
    case when HomeTeamSequence = 'HW AW' THEN COUNT(*) else 0 END 'HW AW',
    case when HomeTeamSequence = 'HW AD' THEN COUNT(*) else 0 END 'HW AD',
    case when HomeTeamSequence = 'HW AL' THEN COUNT(*) else 0 END 'HW AL'
    from fixture_list
    WHERE ftr = 'H'
    GROUP BY HomeTeamSequence

Я предполагаю, что мне нужна какая-то опорная точка.

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 28 мая 2018

Решил, добавив следующее к начальному запросу:

    select Team1,
    coalesce(max(case when Team2 = 'HW HW' then Total end), 0) as 'HW HW',
    coalesce(max(case when Team2 = 'HW HD' then Total end), 0) as 'HW HD',
    coalesce(max(case when Team2 = 'HW HL' then Total end), 0) as 'HW HL'
    --creates row headers
    --repeat for other combinations
    from
    (
    select AwayTeamSequence Team1, HomeTeamSequence Team2,
    COUNT(*) as Total
    from fixture_list
    where FTR = 'H'
    group by HomeTeamSequence, AwayTeamSequence
    ) src
    group by Team1;

следующая ссылка помогла мне получить этот ответ: Инструкция SQL - Матрица SQL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...