#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