Yazması en kolay sorgu MySQL içindir (katı ANSI ayarlarıyla değil). Standart dışı yapıyı kullanır:
SELECT key, value
FROM tableX
GROUP BY key ;
Sıkı ayarların ve ONLY_FULL_GROUP_BY
varsayılan ayarların bulunduğu son sürümde (5.7 ve 8.0+) ANY_VALUE()
, 5.7'de eklenmiş olan işlevi kullanabilirsiniz :
SELECT key, ANY_VALUE(value) AS value
FROM tableX
GROUP BY key ;
Pencere işlevine sahip diğer DBMS'lerde (Postgres, SQL-Server, Oracle, DB2 gibi), bunları bu şekilde kullanabilirsiniz. Avantaj, sonuçtaki diğer sütunları da seçebilmenizdir ( key
ve dışında value
):
SELECT key, value
FROM tableX
( SELECT key, value,
ROW_NUMBER() OVER (PARTITION BY key
ORDER BY whatever) --- ORDER BY NULL
AS rn --- for example
FROM tableX
) tmp
WHERE rn = 1 ;
Yukarıdakilerin eski sürümleri ve diğer tüm DBMS'ler için hemen hemen her yerde işe yarayan genel bir yol. Dezavantajı, bu yaklaşımla diğer sütunları seçememenizdir. Başka gibi o toplama işlevleri olan MIN()
ve MAX()
(biraz, metin, lekeler gibi) bazı DBMSs bazı veri türleri ile işi yok:
SELECT key, MIN(value) AS value
FROM tableX
GROUP BY key ;
PostgreSQL, DISTINCT ON
kullanılabilecek standart dışı özel bir operatöre sahiptir. İsteğe bağlı ORDER BY
, her gruptan hangi satırın seçileceğini seçmektir:
SELECT DISTINCT ON (key) key, value
FROM tableX
-- ORDER BY key, <some_other_expressions> ;