Выборка одной записи из группы
Есть у меня таблица, в которой среди прочих полей есть поля id (PK), freq, sth_code, level.
Теперь мне нужно вытащить те пары (freq, sth_code), которые встречаются более 100 раз и вытащить для них по одной записи с максимальным уровнем.
Что-то тип такого
SELECT
s.*
FROM
(
SELECT
s.`freq`,
s.`stn_code`,
MAX(s.`level`) AS `level`
FROM
mytable s
WHERE
s.`time` > CURRENT_DATE
GROUP BY
s.`freq`,
s.`stn_code`
HAVING
COUNT(*) >= 100
) sub
LEFT JOIN mytable s ON (
s.`freq` = sub.`freq` AND
s.`stn_code` = sub.`stn_code` and
s.`level` = sub.`level`
)
Проблема в том, что тройка (freq, sth_code, level) не уникальна и в базе может быть несколько записей с максимальным уровнем. Из этих нескольких записей (если они есть) мне нужно достать ровно одну любую.
Вопрос о производительности не стоит.
Ответы (1 шт):
Автор решения: Anton Shchyrov
→ Ссылка
Получился такой монстр
SELECT
s.*
FROM
(
SELECT
MAX(s.`id`) AS `id`
FROM
(
SELECT
s.`freq`,
s.`stn_code`,
MAX(s.`level`) AS `level`
FROM
mytable s
WHERE
s.`time` > CURRENT_DATE
GROUP BY
s.`freq`,
s.`stn_code`
HAVING
COUNT(*) >= 100
) sub
LEFT JOIN mytable s ON (
s.`freq` = sub.`freq` AND
s.`stn_code` = sub.`stn_code` and
s.`level` = sub.`level`
)
GROUP BY
s.`freq`,
s.`stn_code`
) sub2
LEFT JOIN mytable s ON (sub2.`id` = s.`id`)