Проблема группировки - PullRequest
2 голосов
/ 17 июля 2009

Когда вы используете Group By, как вы синхронизируете другие поля при использовании агрегатов

Здесь я пытаюсь найти минимальное значение col4, когда col2 = xxx

select col1, col2, col3, min(col4)
from table
where col2 = 'xxx'
group by col3

Я могу получить минимальное значение в col4, но col1 неверно, но col2, col3, col4 равны.

Может кто-нибудь показать мне, как это сделать?

Спасибо

Ответы [ 3 ]

3 голосов
/ 17 июля 2009

Вы используете нестандартное MySQL расширение до GROUP BY.

Этот запрос фактически читается как "для каждого отдельного значения col3, выберите минимальное значение col4 вместе со значениями col1 и col2 из одной строки table, имеющей это значение col3 без определенного порядка "

Например, если у нас есть следующие данные:

col1 col2 col3 col4
---- ---  ---  ----

A    A    1    1
B    B    1    2
C    C    2    3
D    D    2    4

, этот запрос:

SELECT  col1, col2, col3, MIN(col4)
FROM    mytable
GROUP BY
        col3

вернет одно из следующих значений:

col1 col2 col3 col4
---- ---  ---  ----
A    A    1    1
C    C    2    3

col1 col2 col3 col4
---- ---  ---  ----
B    B    1    1
C    C    2    3

col1 col2 col3 col4
---- ---  ---  ----
A    A    1    1
D    D    2    3

col1 col2 col3 col4
---- ---  ---  ----
B    B    1    1
D    D    2    3

я. е. он может вернуть любое значение col1 и col2, найденное в строках, которые вносят вклад в соответствующую группу.

Это эквивалентно FIRST_VALUE аналитической функции, но в произвольном порядке.

Обновление:

Чтобы выбрать значения col1 и col2, соответствующие минимальному значению col4 в каждой группе, используйте это:

SELECT  col1, co2, col3, col4
FROM    (
        SELECT  col1, col2, col3, col4,
                COALESCE(@col3 = col3, FALSE) AS grp,
                @col3 := col3 AS nv
        FROM    (
                SELECT  @col3 := NULL
                ) vars, table
        WHERE   col2 = 'xxx'
        ORDER BY
                col3, col4
        ) q
WHERE   NOT grp
0 голосов
/ 17 июля 2009

Полагаю, вы хотите, чтобы col1-3 соответствовал min (col4) для каждого col3

Что-то вроде:

select X.col1, X.col2, X.col3, X.col4 from table X 
join (select col3, min(col4) as mcol4 from table where col2='xxx' group by col3) as Y
on X.col3=Y.col3 and X.col4=Y.mcol4
where X.col2='xxx';
0 голосов
/ 17 июля 2009
 select a.col3, a.col2, a.col1, a.col4
 from table as a natural join 
       (select col3, min(col4) as col4 from table
        where col2='xxx'
        group by col3 ) as b
 where a.col2 = 'xxx' -- sometimes this helps the optimizer even though it's redundant

Вы можете столкнуться с некоторыми проблемами здесь, когда может быть несколько строк с одинаковыми col3, col4 и col2, но разными col1 - довольно просто исправить с помощью rownums и тому подобного, но это зависит от db.

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