GROUP BY и уникальность в нескольких столбцах - PullRequest
1 голос
/ 28 августа 2009

Допустим, я хочу выбрать 3 столбца из нескольких объединенных таблиц: event_id, home_team и результаты статистической функции. Идентификатор события - это первичный ключ, автоинкремментированный. Команда home_team не уникальна для каждой записи в таблице. Я хочу сгруппировать по event_id, чтобы сгенерировать агрегатную функцию, а затем отсортировать по результатам агрегатной функции, принимая самые высокие 3 значения. Но я также хочу, чтобы home_team был уникальным. Как я могу это сделать? Я не могу сделать DISTINCT, потому что запись будет иметь home_team, event_id и результаты статистической функции. Event_id всегда будет уникальным, поэтому мой запрос DiSTINCT ничего не делает.

Мне нужно сгруппировать по event_id, так как от этого зависит функция агрегирования, поэтому я не могу сгруппировать по home_team. Если я сгруппирую по обоим, это тоже не поможет, потому что ...

Пример

Table 1
  id: 1
  event_id: 1 
  value: 2

  id 2
  event_id: 1 
  value: 6

  id 3
  event_id: 2
  value: 4

  id4
  event_id: 2 
  value: 3

  id5
  event_id: 3
  value: 1

Таблица 2

event_id (PK, autoincremented): 1
home_team: 1

event_id: 2
home_team 2

event_id: 3
home_team: 1

SELECT *, AVG(table1.value) as average FROM table1 JOIN table2 ON table1.event_id = table2.event_id GROUP BY table2.event_id ORDER BY average DESC

Мне нужно сгруппировать по table2.event_id, чтобы сгенерировать правильный результат агрегатной функции. Тем не менее, я также хочу, чтобы home_team отличался, поэтому желаемым результатом будут два результата с event_id 1 и event_id 2

Ответы [ 2 ]

1 голос
/ 28 августа 2009

Что ж, агрегатная функция, сгруппированная по уникальному ключу, мало что сделает для вас, это точно. Звучит так, будто вы устали от идеи группировки, когда на самом деле все, что вам нужно, это три наиболее значимых события для каждого home_team.

Попробуйте что-то вроде этого:

select
    event_id,
    home_team,
    value
from
    my_tbl t
where
    event_id in 
        (select event_id from my_tbl 
         where home_team = t.home_team 
         order by value desc limit 0,3)

Обновление: ваша правка проясняет некоторые вещи, так что здесь:

select
    (select min(event_id) from table2 where home_team = t2.home_team) as event_id,
    t2.home_team,
    avg(t1.value) as average
from
    table1 t1
    inner join table2 t2 on
        t1.event_id = t2.event_id
group by
    t2.home_team

То, что вы описываете, довольно бессмысленно. Вы хотите сгруппировать по event_id, но затем показать только один home_team? Если вы не взяли верхнюю строку home_team:

select
    home_team,
    max(average) as topavg
from
    (
    select
        t2.event_id,
        t2.home_team,
        avg(t1.value) as average
    from
        table1 t1
        inner join table2 t2 on
            t1.event_id = t2.event_id
    group by
        t2.event_id, t2.home_team
    ) as a
group by
    home_team
0 голосов
/ 28 августа 2009

Используйте это:

GROUP BY event_id, home_team

Это сгруппирует только те записи, которые имеют одинаковый event_id и одинаковый home_team.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...