|
|
|
Group by в сложном запросе
|
|||
|---|---|---|---|
|
#18+
У меня есть две таблицы. Игроки (упрощенный вариант): players(id, team_id) и игры games(id, date, home_team_id, away_team_id). Мне нужно вывести id будущих игр для каждого игрока. В теории все понятно, нужно объединить две таблицы (через games.home_team_id = players.team_id or games.away_team_id = players.team_id). Затем сгруппировать по игроку, отфильтровать прошедшие игры и выбрать среди них минимальные даты). Но на практике не удается создать корректный запрос, который бы работал... Код: sql 1. 2. Вот такой запрос работает, и на первый взгляд выдает корректные данные, но если я попытаюсь добавить в SELECT games.id, субд сообщит мне следующее: column "games.id" must appear in the GROUP BY clause or be used in an aggregate function А если я пойду у нее на поводу и добавлю в GROUP BY games.id, то минимальная дата для каждой отдельно взятой игры будет, что логично - датой этой игры. Т.е. я получу не по одной игре для каждого игрока, а все его игры, что не выполняет поставленную задачу. Как выйти из этой ситуации? Долго уже бьюсь, но решения найти не удается.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2015, 10:41 |
|
||
|
Group by в сложном запросе
|
|||
|---|---|---|---|
|
#18+
Exact, удалось найти на форуме решение, выводить в select агрегатную функцию, типа max(). Если данные одинаковые (а так и есть для одной и той же игры), то все будет ок. Но выглядит немного.. костыльно что ли ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2015, 10:56 |
|
||
|
Group by в сложном запросе
|
|||
|---|---|---|---|
|
#18+
авторудалось найти на форуме решение, выводить в select агрегатную функцию, типа max(). Если данные одинаковые (а так и есть для одной и той же игры), то все будет ок. Как оказалось, это не соответствует действительности. MIN (games.id) никак не связана с min (games.sheduled) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2015, 11:07 |
|
||
|
Group by в сложном запросе
|
|||
|---|---|---|---|
|
#18+
ExactУ меня есть две таблицы. Игроки (упрощенный вариант): players(id, team_id) и игры games(id, date, home_team_id, away_team_id). Мне нужно вывести id будущих игр для каждого игрока. В теории все понятно, нужно объединить две таблицы (через games.home_team_id = players.team_id or games.away_team_id = players.team_id). Затем сгруппировать по игроку, отфильтровать прошедшие игры и выбрать среди них минимальные даты). Но на практике не удается создать корректный запрос, который бы работал... Код: sql 1. 2. Вот такой запрос работает, и на первый взгляд выдает корректные данные, но если я попытаюсь добавить в SELECT games.id, субд сообщит мне следующее: column "games.id" must appear in the GROUP BY clause or be used in an aggregate function А если я пойду у нее на поводу и добавлю в GROUP BY games.id, то минимальная дата для каждой отдельно взятой игры будет, что логично - датой этой игры. Т.е. я получу не по одной игре для каждого игрока, а все его игры, что не выполняет поставленную задачу. Как выйти из этой ситуации? Долго уже бьюсь, но решения найти не удается.. читайте документацию по DISTINCT ON это то что вам надо для решения этой задачи --Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2015, 13:15 |
|
||
|
Group by в сложном запросе
|
|||
|---|---|---|---|
|
#18+
Maxim Boguk, таки лучше послать сразу к LATERAL , хотя и ограничено >~ 9.3, но идеологически верно (до тех пор, пока оптимайзер ПЖ не научится таки прилично считать DISTINCT ON) . А иначе такие гробы из под школоты, освоившей DISTINCT ON лезут, мать моя -- женщина. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2015, 14:35 |
|
||
|
Group by в сложном запросе
|
|||
|---|---|---|---|
|
#18+
какие еще дистинкт оны? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2015, 15:29 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=38917749&tid=1998090]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
167ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 233ms |
| total: | 486ms |

| 0 / 0 |
