0

私は複雑な SELECT で問題を抱えています。私は本当にそれに行き詰まっているので、あなたの何人かが私を助けてくれることを願っています...または多分あなたは私を方向に向けることができます.

次の列を持つテーブルがあります。

score1, gamedate1, score2, gamedate2, score3, gamedate3

基本的に、昇順のゲーム時間に基づいて、SUMMED MAX スコアを最初に獲得したすべてのゲームの最終的な勝者を決定する必要があります。

4

2 に答える 2

1

1、2、3 が異なるプレーヤーであると仮定すると、次のように動作するはずです。

-- construct table as the_lotus suggests
WITH LotusTable AS
(
    SELECT 'P1' AS Player, t.Score1 AS Score, t.GameDate1 as GameDate
        FROM Tbl t
    UNION ALL
    SELECT 'P2' AS Player, t.Score2 AS Score, t.GameDate2 as GameDate
        FROM Tbl t
    UNION ALL
    SELECT 'P3' AS Player, t.Score3 AS Score, t.GameDate3 as GameDate
        FROM Tbl t
)
-- get running scores up through date for each player
, RunningScores AS 
(
    SELECT b.Player, b.GameDate, SUM(a.Score) AS Score
    FROM LotusTable a
            INNER JOIN LotusTable b -- self join
                ON a.Player = b.Player
                    AND a.GameDate <= b.GameDate -- a is earlier dates
        GROUP BY b.Player, b.GameDate
)
-- get max score for any player
, MaxScore AS 
(
    SELECT MAX(r.Score) AS Score
        FROM RunningScores r
)
-- get min date for the max score
, MinGameDate AS 
(
    SELECT MIN(r.GameDate) AS GameDate
        FROM RunningsScores r
        WHERE r.Score = (SELECT m.Score FROM MaxScore m)
)
-- get all players who got the max score on the min date
    SELECT * 
        FROM RunningScores r
        WHERE r.Score = (SELECT m.Score FROM MaxScore m)
            AND r.GameDate = (SELECT d.GameDate FROM MinGameDate d)
;

もっと効率的な方法があります。特に、自己結合は回避できます。

于 2013-05-28T00:17:35.310 に答える