2016-01-24 15 views
0
计算前人成果

我试图完成一个有趣的研究,并添加新的功能,现有的数据集PostgreSQL中

ID  DATE   LEAGUE   HOME  AWAY H_GOALS A_GOALS PREV_H_GOALS PREV_A_GOALS 
9911 "2005-01-01" "Bundesliga 1" "Wolfsburg" "Schalke 04" 2  1   NULL  NULL 
9822 "2005-01-01" "Jupiler League" "Beveren" "Lokeren"  2  1   NULL  NULL 
9823 "2005-01-01" "Jupiler League" "Waregem" "Westerlo"  2  3   NULL  NULL 
9824 "2005-01-10" "Jupiler League" "Westerlo" "Beveren"  4  1   3   2 
9932 "2005-01-10" "Bundesliga 1" "Bayern Munich" "Wolfsburg" 2  0   NULL  2 
9933 "2005-01-10" "Bundesliga 1" "Ein Frankfurt" "Schalke 04" 0  1   NULL  1 

现在,我想添加像

  • MATCH_GOALS附加列 - 目标踢在之前的比赛中,球队
  • PREV_RESULT - 以前的比赛结果[1胜2平3负输入]
  • ALL_GOALS_IN_SEASON - 总进球数的球队在本赛季踢

我的情形#1的尝试是不正确的:

SELECT ROW_NUMBER() OVER (ORDER BY start_time DESC) AS rowno, 
     LEAD(m.match_score) OVER (ORDER BY start_time DESC) as MATCH_GOALS, -- #1 

FROM match as m 
WHERE (m.home = m.home OR m.away = m.away) #fail 
ORDER BY start_time DESC 

你可以建议适当的窗函数(PostgreSQL的),或固定的例子吗?

+1

你的问题还不清楚。每行对应两个团队。你想考虑哪支球队? –

+0

我正在寻找为这两个团队获取以前的信息 – SpanishBoy

回答

1

我有一个在SQL Server测试的解决方案,但我看到PostgreSQL支持SQL Server(CTE,窗口函数等)中的所有好东西,所以这应该是一个好的开始。

你的数据结构是直接窗口功能应用相当不友好的,所以CTE获得它的方式更容易处理:

ID, Date, League, Team, Goals 

这允许获得以前的信息,因为球队是存在于单柱。

此外,第一个CTE计算团队在该特定匹配中的结果。

第二个CTE实际上使用LAG窗口函数获取有关以前匹配的信息。

;with PivCTE AS (
    SELECT ID, Date, League, Home AS Team, HGoals AS Goals, 
     (CASE WHEN HGoals > AGoals THEN 1 WHEN HGoals = AGoals THEN 2 ELSE 3 END) AS Result, 
     SUM(HGoals) OVER (PARTITION BY Home ORDER BY (SELECT 1)) AS AllGoals 
    FROM Match 
    UNION 
    SELECT ID, Date, League, Away AS Team, AGoals AS Goals, 
     (CASE WHEN HGoals < AGoals THEN 1 WHEN HGoals = AGoals THEN 2 ELSE 3 END) AS Result, 
     SUM(AGoals) OVER (PARTITION BY Away ORDER BY (SELECT 1)) AS AllGoals 
    FROM Match 
), 
PrevData AS (
    SELECT ID, Date, League, Team, 
     LAG(Goals, 1, NULL) OVER (PARTITION BY Team ORDER BY Date) AS PrevGoals, 
     LAG(Result, 1, NULL) OVER (PARTITION BY Team ORDER BY Date) AS PrevResult, 
     AllGoals 
    FROM PivCTE 
) 
select M.*, 
    PH.PrevGoals AS HomePrevGoals, PA.PrevGoals AS AwayPrevGoals, 
    PH.PrevResult AS HomePrevWin, PA.PrevResult AS AwayPrevWin, 
    PH.AllGoals AS HomeAllGoals, PA.AllGoals AS AwayAllGoals 
FROM Match M 
    JOIN PrevData PH ON PH.ID = M.ID AND PH.Team = M.Home 
    JOIN PrevData PA ON PA.ID = M.ID AND PA.Team = M.Away 
ORDER BY M.Date DESC 

设置数据:

create table Match (
    ID INT NOT NULL, 
    Date DATE NOT NULL, 
    League NVARCHAR(100) NOT NULL, 
    Home NVARCHAR(100) NOT NULL, 
    Away NVARCHAR(100) NOT NULL, 
    HGoals INT NOT NULL, 
    AGoals INT NOT NULL 
) 

insert into Match values 

(9911, '2005-01-01', 'Bundesliga 1', 'Wolfsburg', 'Schalke 04', 2,  1), 
(9822, '2005-01-01', 'Jupiler League', 'Beveren', 'Lokeren',  2,  1), 
(9823, '2005-01-01', 'Jupiler League', 'Waregem', 'Westerlo',  2,  3), 
(9824, '2005-01-10', 'Jupiler League', 'Westerlo', 'Beveren',  4,  1), 
(9932, '2005-01-10', 'Bundesliga 1', 'Bayern Munich', 'Wolfsburg', 2,  0), 
(9933, '2005-01-10', 'Bundesliga 1', 'Ein Frankfurt', 'Schalke 04', 0 ,  1)