Функция SQL MAX возвращает одну строку, если несколько строк имеют одинаковое значение - PullRequest
0 голосов
/ 22 сентября 2018

В одном из моих запросов у меня есть 3 строки, которые содержат одинаковое числовое значение.Когда я использовал для них функцию MAX, она возвращала только 1 строку.У меня вопрос, почему SQL игнорирует другие строки.

Click here for the first query

Click here for the second query

Я знаю, что это не практично, но мне просто интересно, почему это происходит.

Любая помощьбыл бы благодарен.

Спасибо

Ответы [ 3 ]

0 голосов
/ 22 сентября 2018

может быть, вы используете версию mysql, предшествующую 5.7 ...

, в этой версии mysql позволяет использовать функцию агрегации без упоминания в группе всеми столбцами в select, но не в функции агрегации.(это не разрешено в mysql, начиная с mysql 5.7)

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

    select max(customer_id), country, max(total) 
    from  (
        select customer.customerId as customer_id
            ,  invoice.billingCountry as country
            , sum(invoice.total) as total
        from  invoice
        join customer on customer.cutomerId = invoice.customerId
        where invoice.billingCountry = 'United  Kingdom'
        group by 1
    ) t
    group by country
0 голосов
/ 22 сентября 2018

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

Вот второй запрос

SELECT Customer_ID, Country, MAX(Total) FROM (SELECT customer.CustomerId AS Customer_ID, invoice.BillingCountry AS Country, SUM(invoice.Total) AS Total FROM Invoice JOIN Customer ON Customer.CustomerId = invoice.CustomerId WHERE invoice.BillingCountry = 'United Kingdom' GROUP BY Customer_ID)

Я использую ChinookDatabase, которая является просто примером базы данных с SQLite.

0 голосов
/ 22 сентября 2018

Если вы хотите строки с максимальным значением, тогда подумайте «фильтрация», а не «агрегация»:

Кроме того, join не требуется.Все необходимые вам столбцы находятся в invoice.Итак:

select i.*
from invoice i 
where i.invoiceTotal = (select max(i2.invoiceTotal)
                        from invoice i2
                       );

Причина, по которой ваш запрос возвращает одну строку, заключается в том, что это агрегирующий запрос без group by.По определению, такой запрос возвращает в точности одну строку (даже если базовая таблица пуста).

Вы выбираете столбцы, не входящие в group by.Как правило, это ошибка, хотя некоторые базы данных (к сожалению) допускают этот синтаксис.В любом случае, я подозреваю, что вышеприведенная версия делает то, что вам действительно нужно.

...