0

I am trying to build reports for sport team. The results are stored in a SQL-Database like this: Table

For the reports I need the columns Home2-Away4 to be filled with the corresponding results. Which means:

Imagine: ID=10 and Home(no.) (Team#) = 1 --> Home1 = result one game before which is ID=3 and the team played away and the result was 0 (=home1). This is what I already have done, but Home2 = result two games ago, as Home3=result three games ago and so on.

And here is how I have done this:

SELECT top 1 [result_home] from (SELECT Top 2 [result_home] FROM 
(SELECT top 2 [result_home]  from [Table]
where [ID] < 10  and ( [Home(no.)]=1 or [Away(No.)]=1 ) order by [ID] desc  ) top2     )top1 

(Microsoft SQL Server Express 2012 btw.)

I have written a small Java code which decides if to pick from result_home or result_away.

The basic question is: How is it possible to query for game results two and more gamedays ago?

Thanks in advance.

Kind regards

Stefan

4

2 に答える 2

2

LAG機能が必要だと思います。最も単純なケースは次のようになります。

[Home1] = LAG(result_Home, 1) OVER(PARTITION BY [Home(no.)] ORDER BY ID),

ただし、ホームまたはアウェイを参照する必要があるため、これほど単純ではありません。そのため、最初にデータのピボットを解除する必要があります

SELECT  ID,
        Type,
        TeamID,
        Result
FROM    T
        CROSS APPLY 
        (   VALUES 
                ('Home', [Home(no.)], Result_Home), 
                ('Away', [Away(no.)], Result_Away)
        ) Upvt (Type, TeamID, Result);

これは、ホームでもアウェイでも、各チームの結果にすべて 1 つの列でアクセスできることを意味します (ラグ関数の場合)。

次に、このピボットされていないデータを使用して、ラグを適用して前の 4 つの結果を取得します (使用ORDER BY IDしたことがありますが、欠落している日付フィールドがあると思いますか?):

SELECT  *,
        [Result1] = LAG(Result, 1) OVER(PARTITION BY TeamID ORDER BY ID),
        [Result2] = LAG(Result, 2) OVER(PARTITION BY TeamID ORDER BY ID),
        [Result3] = LAG(Result, 3) OVER(PARTITION BY TeamID ORDER BY ID),
        [Result4] = LAG(Result, 4) OVER(PARTITION BY TeamID ORDER BY ID)
FROM    (Previous Query)

次に、各チームが各試合の前の 4 つの結果を取得したら、ピボットされていないデータを結合して、ホーム チームとアウェイ チームを同じ行に再び取得し、完全なクエリを与えることができます。

WITH Results AS
(   SELECT  ID,
            Type,
            TeamID,
            Result
    FROM    T
            CROSS APPLY 
            (   VALUES 
                    ('Home', [Home(no.)], Result_Home), 
                    ('Away', [Away(no.)], Result_Away)
            ) Upvt (Type, TeamID, Result)
), Results2 AS
(   SELECT  *,
            [Result1] = LAG(Result, 1) OVER(PARTITION BY TeamID ORDER BY ID),
            [Result2] = LAG(Result, 2) OVER(PARTITION BY TeamID ORDER BY ID),
            [Result3] = LAG(Result, 3) OVER(PARTITION BY TeamID ORDER BY ID),
            [Result4] = LAG(Result, 4) OVER(PARTITION BY TeamID ORDER BY ID)
    FROM    Results
)
SELECT  Home.ID,
        [Home(no.)] = Home.TeamID ,
        [Away(no.)] = Away.TeamID,
        [Result_Home] = Home.Result,
        [Result_Away] = Away.Result,
        [Home1] = Home.Result1,
        [Home2] = Home.Result2,
        [Home3] = Home.Result3,
        [Home4] = Home.Result4,
        [Away1] = Away.Result1,
        [Away2] = Away.Result2,
        [Away3] = Away.Result3,
        [Away4] = Away.Result4
FROM    Results2 AS Home
        INNER JOIN results2 AS Away
            ON Away.ID = Home.ID
            AND Away.Type = 'Away'
WHERE   Home.Type = 'Home'
ORDER BY ID;

SQL Fiddle の例

于 2012-10-31T14:48:00.843 に答える
0

ROW_NUMBER()関数または別のウィンドウ関数を探しているようです

何かのようなもの

;with cte as 
(
    select id, home as team, result_home as score from yourtable
    union
    select id, away, result_away from yourtable
),
games as
(
    select *, ROW_NUMBER() over (partition by team order by id) as gameday
    from cte
)   
    select  *
    from (select team, score, gameday from games) src
    pivot
    (max(score) for gameday in ([1],[2],[3],[4],[5],[6]))p

各チームの個々の試合の試合日がわかっている場合、2 試合前がこの試合の試合日 - 2 などになります。

于 2012-10-31T14:42:32.987 に答える