How to select distinct for one column and any in another column?
The easiest query to write is for MySQL (with not strict ANSI settings). It uses the non-standard construction:
SELECT key, value
FROM tableX
GROUP BY key ;
In recent version (5.7 and 8.0+) where the strict settings and ONLY_FULL_GROUP_BY
are the default, you can use the ANY_VALUE()
function, added in 5.7:
SELECT key, ANY_VALUE(value) AS value
FROM tableX
GROUP BY key ;
For other DBMSs, that have window functions (like Postgres, SQL-Server, Oracle, DB2), you can use them like this. The advantage is that you can select other columns in the result as well (besides the key
and 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 ;
For older versions of the above and for any other DBMS, a general way that works almost everywhere. One disadvantage is that you cannot select other columns with this approach. Another is that aggregate functions like MIN()
and MAX()
do not work with some datatypes in some DBMSs (like bit, text, blobs):
SELECT key, MIN(value) AS value
FROM tableX
GROUP BY key ;
PostgreSQL has a special non-standard DISTINCT ON
operator that can also be used. The optional ORDER BY
is for selecting which row from every group should be selected:
SELECT DISTINCT ON (key) key, value
FROM tableX
-- ORDER BY key, <some_other_expressions> ;
For MS-SQl Server:
;with FinalDataset as
(
select *,
row_number() over(partition by key order by value) as rownum
from YourOriginalTable
)
select
key,
value
from FinalDataset
where rownum = 1
Likewise, you could have rownum = 2 for your second result set
Similar to accepted answer, but instead of min() or max() you can use array_agg()
SELECT key, (array_agg(value))[1] AS value
FROM tableX
GROUP BY key ;
You can optionally order values inside array to select biggest or smallest of them:
SELECT key, (array_agg(value) ORDER BY value DESC)[1] AS value
FROM tableX
GROUP BY key ;
(checked on PostgreSQL)