Oracle — некоторые проблемы с групповыми операциями

#oracle #select #grouping

#Oracle #выберите #группировка

Вопрос:

Мне нужна ваша помощь… я потратил больше времени, но не могу найти решение (я думаю, что это просто, но у меня ошибки в Oracle : ( 🙁 )

пример: у меня есть таблица с командами: какая команда играла в gameDate: когда сыграно goalHours: когда TeamA или TeamB забивают гол goalNumber: сколько голов делают за один и тот же час endGame: когда заканчивают игру

 teams            gameDate goalHours goalNumber endGame  
team01-VS-team02 20110901 21 2 20110902
team01-VS-team02 20110901 22 1 20110902
team01-VS-team02 20110901 23 3 20110902
team03-VS-team02 20110902 18 3 20110905 
team03-VS-team02 20110902 19 1 20110905
team04-VS-team02 20110904 06 5 20110906
team01-VS-team02 20110101 18 1 20110902
  

Мне нужен select со всеми различными TeamA-VS-TeamB последней игровой датой
мне нужны для каждой отдельной команды ПРОТИВ TeamB в их последней игре отдельные часы goalHours, сумма goalNumber и время остановки игры.

что-то вроде этого:

 teams            lastGameDate distinctGoalHours sumGoalNumber endGame  
team01-VS-team02 20110901 3 6 20110902
team03-VS-team02 20110902 2 4 20110905 
team04-VS-team02 20110904 1 5 20110906
  

я пытаюсь с:

 SELECT   teams,
MAX(gameDate),
MAX (endDate),
SUM (goalNumber),
COUNT (DISTINCT goalHours)
       FROM myTable
GROUP BY teams
  

этот select работает плохо, потому что я не хочу count
team01-VS-team02 20110101 18 1 20110902, это не дата последней игры.
при этом выборе у меня есть 4 различных целевых часа и 7 итоговых значений.

мне нужен select с

 team01-VS-team02 20110901 3 6 20110902
team03-VS-team02 20110902 2 4 20110905
team04-VS-team02 20110904 1 5 20110906
  

… Я надеюсь, что я показываю вам всю необходимую информацию и большое вам спасибо! 😀

Ответ №1:

Как и в любом другом SQL, вам необходимо ограничить набор результатов соответствующим фильтром. В вашем случае вам необходимо использовать подзапрос, чтобы определить последнюю версию gameDate для каждой команды.

Существует несколько различных способов реализации этого. Вот один из них, который работает:

 SQL> SELECT   teams,
            MAX(gameDate),
            MAX (endGame),
            SUM (goalNumber),
            COUNT (DISTINCT goalHours)
FROM  myTable
WHERE (teams, gameDate) IN
    ( select teams, max(gameDate)
      from myTable
      GROUP BY teams )
GROUP BY teams
/
  2    3    4    5    6    7    8    9   10   11   12  
TEAMS                          MAX(GAMED MAX(ENDGA SUM(GOALNUMBER) COUNT(DISTINCTGOALHOURS)
------------------------------ --------- --------- --------------- ------------------------
team03-VS-team02               02-SEP-11 05-SEP-11               4                        2
team01-VS-team02               01-SEP-11 02-SEP-11               6                        3
team04-VS-team02               04-SEP-11 06-SEP-11               5                        1

SQL> 
  

Комментарии:

1. Спасибо!!! 😀 😀 … (команды, gameDate) В (выберите команды, максимум (gameDate), мне нравится это решение!!! 😀

Ответ №2:

Вам необходимо включить gameDate в группу by. Что-то вроде:

 SELECT  teams
    ,   gameDate
    ,   MAX( endDate )
    ,   SUM( goalNumber )
    ,   COUNT( DISTINCT goalHours )
FROM    myTable
GROUP BY teams
    ,    gameDate