2013-05-27 4 views
0

У меня проблема с сложным SELECT, поэтому я надеюсь, что некоторые из вас могут помочь мне, потому что я действительно застрял с ней ... или, может быть, вы можете указать мне в направлении ,Упорядочить по дате разные столбцы

У меня есть таблица со следующими столбцами:

score1, gamedate1, score2, gamedate2, score3, gamedate3 

В принципе мне нужно, чтобы определить окончательный победитель всех игр, которые получили оценку ПОДВЕДЕН MAX FIRST, основанную на время игр в возрастающем порядке.

+2

Если возможно, вы должны иметь вместо этого «score, gamedate, number», это будет намного проще делать запросы. –

+1

С чем вы сталкиваетесь? [У вас есть попытка запроса, на который мы можем смотреть?] (Http://whathaveyoutried.com) – Dukeling

+0

@the_lotus: привет, thx для подсказки !, попробует ваш подход в следующий раз! – Platanus79

ответ

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) 
; 

Есть более эффективные способы сделать это; в частности, можно было бы избежать самосоединения.

+0

Дорогой Марк! Thx за усилия, которые вы сделали, помогли мне выйти из этой ситуации! Я попробую ваше решение! – Platanus79

+0

Мне нравится имя;) –

0

Если таблицы устанавливаются три колонки: player_id, score1, время

Тогда вам просто нужно простой запрос, чтобы подвести их оценки и сгруппировать их по player_ID следующим образом:

SELECT gamedata1.player_ID as 'Player_ID', 
    sum(gamedata1.score1 + gamedata2.score1 + gamedata3.score1) as 'Total_Score' 

FROM gamedata1 
LEFT JOIN gamedata2 ON (gamedata1.player_ID = gamedata2.player_ID) 
LEFT JOIN gamedata3 ON (gamedata1.player_ID = gamedata3.player_ID) 

GROUP BY 'player_ID' 

ORDER BY time ASC 

Объяснение : Вы по существу группируете каждого игрока, чтобы вы могли получить отдельного игрока в каждой строке, а затем суммировать свои баллы и организовывать данные таким образом. Я ставлю «время» как тип даты. Может быть изменен грубо на любой тип данных и т. Д., Которые вы бы предпочли. Структура запроса будет одинаковой.

+0

Вы близки ... снова читайте вопрос - он хочет, чтобы суммы меняли порядок – Hogan

Смежные вопросы