Мне нужно запросить базу данных SQL, чтобы найти все различные значения одного столбца, и мне нужно произвольное значение из другого столбца. Например, рассмотрим следующую таблицу с двумя столбцами, ключом и значением:
key value
=== =====
one test
one another
one value
two goes
two here
two also
three example
Я хочу получить по одной выборочной строке, выбранной произвольно, из каждого отдельного ключа, возможно, получая эти три строки:
key value
=== =====
one test
two goes
three example
Как я могу сформулировать такой запрос в SQL?
Ответы:
Самый простой запрос для записи - для MySQL (с не строгими настройками ANSI). Используется нестандартная конструкция:
В последних версиях (5.7 и 8.0+), где строгие настройки и
ONLY_FULL_GROUP_BY
являются настройками по умолчанию, вы можете использоватьANY_VALUE()
функцию, добавленную в 5.7:Для других СУБД, которые имеют оконные функции (например, Postgres, SQL-Server, Oracle, DB2), вы можете использовать их следующим образом. Преимущество в том, что вы можете выбрать и другие столбцы в результате (кроме
key
иvalue
):Для более старых версий выше и для любой другой СУБД, общий способ, который работает почти везде. Одним из недостатков является то, что вы не можете выбрать другие столбцы с этим подходом. Другое - агрегатные функции, такие как
MIN()
иMAX()
не работающие с некоторыми типами данных в некоторых СУБД (например, бит, текст, большие двоичные объекты):PostgreSQL имеет специальный нестандартный
DISTINCT ON
оператор, который также можно использовать. НеобязательныйORDER BY
для выбора строки из каждой группы:источник
ORDER BY whatever
запрос в ypercube на вызов функции для рандомизации результатов.Для сервера MS-SQl:
Точно так же вы могли бы иметь rownum = 2 для вашего второго набора результатов
источник
Аналогично принятому ответу, но вместо min () или max () вы можете использовать array_agg ()
Вы можете при желании упорядочить значения внутри массива, чтобы выбрать самые большие или самые маленькие из них:
(проверено на PostgreSQL)
источник