Как я могу выбрать строки с MAX (значение столбца), DISTINCT по MULTIPLE столбцы в SQL

0

Мой стол:

id  env       date      name    PI # 
---|-----|------------|--------|-----
 1 | 10  | 04/03/2009 |   john | 399 
 2 | 11  | 04/03/2009 |  juliet| 244 
 5 | 12  | 04/03/2009 |  borat | 345
 3 | 10  | 03/03/2009 |  john  | 399
 4 | 11  | 03/03/2009 | juliet | 244
 6 | 12  | 03/03/2009 |  borat | 500
 7 | 13  | 24/12/2008 |  borat | 650
 8 | 13  | 01/01/2009 |  borat | 650

Этот пост немного изменен по сравнению с вопросом ниже.

Как я могу выбрать строки с MAX (значение столбца), DISTINCT по другому столбцу в SQL?

Разница в том, что я хочу выбрать каждую отдельную среду и PI #, содержащий максимальное значение даты. Например, когда две строки имеют одинаковые env и их PI # одинаковы (строки 3 & 1, 2 & 4, 7 & 8), я хотел бы вернуть строку с максимальной датой.

Ниже приведен желаемый результат.

id  env     date      name    PI # 
---|----|------------|--------|----
 1 | 10 | 04/03/2009 | john   | 399
 2 | 11 | 04/03/2009 | juliet | 244
 5 | 12 | 04/03/2009 | borat  | 345
 6 | 12 | 03/03/2009 | borat  | 500
 8 | 13 | 01/01/2009 | borat  | 650
Теги:
max
distinct

3 ответа

1

Типичный метод использует коррелированный подзапрос:

select t.*
from t
where t.date = (select max(t2.date) from t t2 where t2.env = t.env);

Возможно, немного лучший метод:

select t.*
from t
where t.id = (select t2.id
              from t t2 
              where t2.env = t.env
              order by t2.date desc, t2.id desc
              limit 1
             );

Это немного лучше, потому что (1) id, вероятно, является первичным ключом, поэтому сравнение происходит быстрее; и (2) если в одну и ту же дату есть несколько строк, возвращается только одна строка.

0

Я думаю, это то, что вы хотите:

SELECT * FROM (SELECT DISTINCT table1.env, table1.PI FROM table1) AS q 
INNER JOIN table1 AS t ON (q.PI = t.PI) AND (q.env = t.env)
WHERE t.date = (SELECT MAX(table1.date) FROM table1 WHERE table1.env = t.env AND table1.PI=t.PI)
0

Вы можете использовать следующий способ для получения желаемых результатов:

select *
  from tab 
 where (env,date,PI) in
(
select env, max(date) as date, PI
  from tab
 group by env, PI  
);

 id env    date     name     PI
 -- --- ---------- -------  ----
 1  10  04.03.2009  john    399
 2  11  04.03.2009  juliet  244
 5  12  04.03.2009  borat   345
 6  12  03.03.2009  borat   500
 8  13  01.01.2009  borat   650

Rextester Demo

Ещё вопросы

Сообщество Overcoder
Наверх
Меню