私は複雑な SELECT で問題を抱えています。私は本当にそれに行き詰まっているので、あなたの何人かが私を助けてくれることを願っています...または多分あなたは私を方向に向けることができます.
次の列を持つテーブルがあります。
score1, gamedate1, score2, gamedate2, score3, gamedate3
基本的に、昇順のゲーム時間に基づいて、SUMMED MAX スコアを最初に獲得したすべてのゲームの最終的な勝者を決定する必要があります。
私は複雑な SELECT で問題を抱えています。私は本当にそれに行き詰まっているので、あなたの何人かが私を助けてくれることを願っています...または多分あなたは私を方向に向けることができます.
次の列を持つテーブルがあります。
score1, gamedate1, score2, gamedate2, score3, gamedate3
基本的に、昇順のゲーム時間に基づいて、SUMMED MAX スコアを最初に獲得したすべてのゲームの最終的な勝者を決定する必要があります。
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)
;
もっと効率的な方法があります。特に、自己結合は回避できます。