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

Рейтинг: 1Ответов: 2Опубликовано: 04.04.2023

Коллеги, прошу совета. Есть таблица, например, table, с тремя полями, например field1, field2, field3. Надо получить в одном запросе два значения:

  1. Максимум поля field1
  2. Значение поля 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

В общем, что-то я не понимаю, прошу совета.

Ответы

▲ 3Принят

Есть два хорошо оптимизированных запроса (надеюсь, соответствующие индексы в наличии). У которых между собой ничего общего, кроме таблицы-источника, нет. Причём каждый запрос возвращает строго одну запись. В таких условиях решение по объединению очевидно. CROSS JOIN.

SELECT *
FROM ( 
    SELECT MAX(field1) field1 
    FROM table 
    ) t1
CROSS JOIN ( 
    SELECT field2 
    FROM table 
    ORDER BY field3 DESC LIMIT 1
    ) t2
;
▲ 3

Костыль:

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);