Muszę wysłać zapytanie do bazy danych SQL, aby znaleźć wszystkie odrębne wartości jednej kolumny, i potrzebuję dowolnej wartości z innej kolumny. Rozważmy na przykład poniższą tabelę z dwiema kolumnami, kluczem i wartością:
key value
=== =====
one test
one another
one value
two goes
two here
two also
three example
Chcę odzyskać jeden przykładowy wiersz, wybrany dowolnie, z każdego odrębnego klucza, być może otrzymując te trzy wiersze:
key value
=== =====
one test
two goes
three example
Jak sformułować takie zapytanie w SQL?
Odpowiedzi:
Najłatwiejsze do napisania zapytanie dotyczy MySQL (bez ścisłych ustawień ANSI). Wykorzystuje niestandardową konstrukcję:
W najnowszej wersji (5.7 i 8.0+), w której rygorystyczne ustawienia
ONLY_FULL_GROUP_BY
są domyślne, możesz użyćANY_VALUE()
funkcji dodanej w 5.7:W przypadku innych DBMS, które mają funkcje okien (takie jak Postgres, SQL-Server, Oracle, DB2), możesz ich używać w ten sposób. Zaletą jest to, że możesz również wybrać inne kolumny w wyniku (oprócz
key
ivalue
):Dla starszych wersji powyższego i dla dowolnego innego DBMS, ogólny sposób, który działa prawie wszędzie. Wadą jest to, że nie można wybrać innych kolumn przy takim podejściu. Innym jest to, że funkcje agregujące, takie jak
MIN()
iMAX()
nie działają z niektórymi typami danych w niektórych DBMS (takich jak bit, tekst, obiekty BLOB):PostgreSQL ma specjalnego niestandardowego
DISTINCT ON
operatora, z którego można także korzystać. OpcjonalneORDER BY
jest wybranie wiersza z każdej grupy:źródło
ORDER BY whatever
zapytanie w ypercube wywołaniem funkcji losowej wyników.W przypadku serwera MS-SQl:
Podobnie, możesz mieć rownum = 2 dla drugiego zestawu wyników
źródło
Podobna do zaakceptowanej odpowiedzi, ale zamiast min () lub max () możesz użyć array_agg ()
Opcjonalnie możesz zamówić wartości wewnątrz tablicy, aby wybrać największą lub najmniejszą z nich:
(zaznaczone na PostgreSQL)
źródło