Выбор максимума из одного поля и значения другого поля по максимуму третьего поля
Коллеги, прошу совета. Есть таблица, например, table, с тремя полями, например field1, field2, field3. Надо получить в одном запросе два значения:
- Максимум поля
field1 - Значение поля
field2в записи, где полеfield3максимально.
Значения поля field3 уникальны, так что оба ответа однозначны.
Решить эти две задачи двумя запросами не проблема.
1:
SELECT MAX(field1) FROM table;
2:
SELECT field2 FROM table
ORDER BY field3 DESC
LIMIT 1;
или для второй задачи вариант с WHERE:
SELECT field2 FROM table
WHERE field3 = (SELECT MAX(field3) FROM table);
Но получить оба в одном запросе - не получается. Пишу что-то такое:
WITH max_field3 AS (
SELECT field3 FROM table WHERE field3 = (SELECT MAX(field3) FROM table))
SELECT MAX(field1), max_field3.field3 FROM table;
Пишет missing FROM-clause...
Если пишу так:
WITH max_field3 AS (
SELECT field3 FROM table WHERE field3 = (SELECT MAX(field3) FROM table))
SELECT MAX(field1), max_field3.field3 FROM table, max_field3;
Пишет - нужен GROUP BY
В общем, что-то я не понимаю, прошу совета.
Ответы (2 шт):
Костыль:
select
max(a) as a,
max(c * 10000 + b) - max(c) * 10000 as b,
max(c) as cd
from tbl
Нормально:
select
(select max(a) from tbl) as a,
b,
c
from tbl
order by c desc
limit 1
Проверял на
create table tbl (a integer, b integer, c integer);
insert into tbl (a, b, c) values (1, 7, 1);
insert into tbl (a, b, c) values (2, 3, 2);
insert into tbl (a, b, c) values (3, 2, 7);
insert into tbl (a, b, c) values (4, 1, 6);
insert into tbl (a, b, c) values (5, 4, 3);
insert into tbl (a, b, c) values (6, 5, 4);
insert into tbl (a, b, c) values (7, 6, 5);
Есть два хорошо оптимизированных запроса (надеюсь, соответствующие индексы в наличии). У которых между собой ничего общего, кроме таблицы-источника, нет. Причём каждый запрос возвращает строго одну запись. В таких условиях решение по объединению очевидно. CROSS JOIN.
SELECT *
FROM (
SELECT MAX(field1) field1
FROM table
) t1
CROSS JOIN (
SELECT field2
FROM table
ORDER BY field3 DESC LIMIT 1
) t2
;