Мой стол:
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
Типичный метод использует коррелированный подзапрос:
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) если в одну и ту же дату есть несколько строк, возвращается только одна строка.
Я думаю, это то, что вы хотите:
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)
Вы можете использовать следующий способ для получения желаемых результатов:
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