Найпростіший запит для написання - це MySQL (з не суворими налаштуваннями ANSI). Тут використовується нестандартна конструкція:
SELECT key, value
FROM tableX
GROUP BY key ;
В останній версії (5.7 та 8.0+), де жорсткі налаштування і ONLY_FULL_GROUP_BY
є типовими налаштуваннями , ви можете використовувати ANY_VALUE()
функцію, додану в 5.7:
SELECT key, ANY_VALUE(value) AS value
FROM tableX
GROUP BY key ;
Для інших СУБД, які мають віконні функції (наприклад, Postgres, SQL-сервер, Oracle, DB2), ви можете використовувати їх так. Перевага полягає в тому, що ви можете також вибрати інші стовпці в результаті (крім key
і 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 ;
Для старих версій вище та для будь-яких інших СУБД загальний спосіб, який працює майже скрізь. Одним недоліком є те, що ви не можете вибрати інші стовпці при такому підході. Інше полягає в тому, що функції агрегації люблять MIN()
і MAX()
не працюють з деякими типами даних у деяких СУБД (наприклад, біт, текст, краплі):
SELECT key, MIN(value) AS value
FROM tableX
GROUP BY key ;
PostgreSQL має спеціальний нестандартний DISTINCT ON
оператор, який також можна використовувати. Необов'язково ORDER BY
- вибір того, який рядок із кожної групи слід вибрати:
SELECT DISTINCT ON (key) key, value
FROM tableX
-- ORDER BY key, <some_other_expressions> ;