Этот вопрос касается функциональности first_value()
, используя другую функцию или обходной путь.
Это также о "небольшом выигрыше в производительности" в больших таблицах. Использовать, например. max()
в объясненном контексте ниже, требует ложных сравнений. Даже если быстро, это налагает дополнительные расходы.
Этот типичный запрос
SELECT x, y, count(*) as n
FROM t
GROUP BY x, y;
необходимо повторить все столбцы в GROUP BY
, чтобы вернуть более одного столбца. Синтаксический сахар для этого состоит в использовании позиционных ссылок:
SELECT x, y, count(*) as n
FROM t
GROUP BY x, 2 -- imagine that 2, 3, etc. are repeated with x
Иногда для понимания сложного контекста иногда требуется не только сахар, но и некоторые семантики:
SELECT x, COALESCE(y,z), count(*) as n
FROM t
GROUP BY x, y, z -- y and z are not "real need" grouping clauses?
Я могу представить много других сложных контекстов. Рассмотрим обычные решения:
SELECT x, max(y) as y, count(*) as n
FROM t
GROUP BY x -- best semantic! no need for other columns here
где max()
функция может быть любой "sample()" (например, первое или последнее значение). Производительность чего-то, что ничего не делает, лучше, чем max()
, например. агрегированную функцию first_value()
, но ей нужна WINDOW
, поэтому потерянная производительность. Есть несколько старых предложений для реализации первых/последних функций agg в C.
Есть ли какая-либо функция "получить какое-то одно быстрое значение" с более высокой производительностью, чем max()
или GROUP BY X,2,...
?
Возможно, какая-то новая функция в недавнем выпуске?