Виберіть максимальне значення для кожної групи


87
Name    Value   AnotherColumn
-----------
Pump 1  8000.0  Something1
Pump 1  10000.0 Something2
Pump 1  10000.0 Something3
Pump 2  3043    Something4
Pump 2  4594    Something5
Pump 2  6165    Something6

Мій стіл виглядає приблизно так. Я хотів би знати, як вибрати максимальне значення для кожного насоса.

select a.name, value from out_pumptable as a,
(select name, max(value) as value from out_pumptable where group by posnumber)g where and g.value = value

цей код виконує роботу, але я отримую два записи насоса 1, оскільки він має два записи з однаковим значенням.

Відповіді:


182
select name, max(value)
from out_pumptable
group by name

38
Але це не буде працювати на Postgres або будь-яких інших СУБД із суворими GROUP BY. Строго GROUP BYкожен стовпець у вашому SELECTповинен або відображатися у вашому, GROUP BYабо бути використаний в сукупній функції.
NickAb

4
Правильно. "Працює в MySQL" у цьому контексті в основному означає, що він не виходить з ладу, не те, що він обов'язково повертає правильний результат.
Крейг

2
Неправильно @Craig, цей запит працює у всіх варіантах rdbms і повертає дані, як очікувалося, оскільки OP не повернув весь запис з максимальним значенням на групу, а бажав максимальне значення на насос. Список відбору має 2 поля: ім'я та значення. Назва входить у групу за реченням, а значення агрегується через макс. Я не бачу жодної версії відповіді, де було б більше полів у списку вибору.
Тінь

3
@Craig це було не за замовчуванням. Він був змінений у v5.7.5, майже 3 роки тому. Але знову ж таки, ви пропускаєте думку: код у цій відповіді відповідає стандарту sql, тому група mysql, встановивши значення, не має значення.
Тінь

13
@NickAb Мені чогось не вистачає? Кожен стовпець знаходиться або в групі, або у функції агрегування
Роб

17
SELECT
  b.name,
  MAX(b.value) as MaxValue,
  MAX(b.Anothercolumn) as AnotherColumn
FROM out_pumptabl
INNER JOIN (SELECT 
              name,
              MAX(value) as MaxValue
            FROM out_pumptabl
            GROUP BY Name) a ON 
  a.name = b.name AND a.maxValue = b.value
GROUP BY b.Name

Зауважте, це було б набагато простіше, якби у вас був первинний ключ. Ось приклад

SELECT * FROM out_pumptabl c
WHERE PK in 
    (SELECT
      MAX(PK) as MaxPK
    FROM out_pumptabl b
    INNER JOIN (SELECT 
                  name,
                  MAX(value) as MaxValue
                FROM out_pumptabl
                GROUP BY Name) a ON 
      a.name = b.name AND a.maxValue = b.value) 

Ах, боже. Я зробив приклад занадто простим. Там більше стовпців таблиці, що робить її дещо складнішою>. <
Вай Вонг

Якщо є більше стовпців, просто додайте їх до вибраного
m.edmondson

Чи можете ви детальніше розказати колони? Що ти намагаєшся згрупувати?
Джон Хартсок,

@Wai Неправильно Я бачу, що ви додали ще один стовпець, але вам потрібно пояснити, що ви хочете з ним робити? Повернути значення з цього стовпця? Ви хочете згрупувати за іменами та SomeOtherColumn?
Джон Хартсок,

Додано ще один стовпець. Я хочу отримати максимальне значення для кожного насоса разом із значеннями, які знаходяться в рядку максимального значення з інших стовпців. Я стає занадто заплутаним?
Вай Вонг

16
select name, value 
from( select name, value, ROW_NUMBER() OVER(PARTITION BY name ORDER BY value desc) as rn
from out_pumptable ) as a
where rn = 1

Це єдиний приклад, який працює для мого випадку. У мене є кілька значень на «реєстрацію». Мені потрібне останнє значення для кожної реєстрації, зліва ззовні. Замовлений id DESCна PARTITIONі загорнув цей запит в LEFT OUTER JOIN as grades ON grades.enrollment_id = enrollment.idі відмінно працює.
lucasarruda

3
select Name, Value, AnotherColumn
from out_pumptable
where Value =
(
  select Max(Value)
  from out_pumptable as f where f.Name=out_pumptable.Name
)
group by Name, Value, AnotherColumn

Спробуйте так, це працює.




-3
SELECT DISTINCT (t1.ProdId), t1.Quantity FROM Dummy t1 INNER JOIN
       (SELECT ProdId, MAX(Quantity) as MaxQuantity FROM Dummy GROUP BY ProdId) t2
    ON t1.ProdId = t2.ProdId
   AND t1.Quantity = t2.MaxQuantity
 ORDER BY t1.ProdId

це дасть вам ідею.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.