Предполагая, что у меня есть следующие агрегатные функции:
Можно ли написать действительный SQL (без учета базы данных) следующим образом:
SELECT [COL1, COL2 ....], AGG1(param1), AGG2(param2) FROM [SOME TABLES]
WHERE [SOME CRITERIA]
HAVING AGG3(param2) >-1 and AGG4(param4) < 123
GROUP BY COL1, COL2, ... COLN
ORDER BY COL1, COLN ASC
LIMIT 10
Где COL1 ... COLN - столбцы в запрашиваемых таблицах, а param1 ... paramX - параметры, передаваемые в функции AGG.
Примечание: AGG1 и AGG2 возвращаются в результатах в виде столбцов (но не отображаются в HAVING CLAUSE, а AGG3 и AGG4 появляются в HAVING CLAUSE, но не возвращаются в наборе результатов.
В идеале мне нужен независимый от БД ответ на решение, но если мне нужно привязаться к БД, я использую PostgreSQL (v9.x).
Редактировать
Просто уточнение: я не против использования GROUP BY в запросе. Мой SQL не очень хорош, поэтому приведенный выше пример SQL может немного вводить в заблуждение. Я отредактировал псевдо sql заявление выше, чтобы, надеюсь, прояснить свои намерения.
Главное, что я хотел выяснить, могло ли запрос select, использующий функции AGG:
- Содержит значения функций agg в возвращаемом столбце без указания их в предложении HAVING.
- Содержат функции agg, указанные в предложении HAVING, но не возвращаются в наборе результатов.
Из ответов, которые я получил до сих пор, казалось бы, ответ на оба вопроса - ДА. Единственное, что мне нужно сделать, чтобы исправить мой SQL, - это добавить предложение GROUP BY, чтобы убедиться, что возвращаемые строки уникальны.