24

I would like to have a Sql Server equivalent of the PostgreSQL distinct on ()

a  b
----
1  1
1  2
2  2
2  1
3  3

select distinct on (a) * 
from my_table

a  b
----
1  1
2  2
3  3

I could do in SQL Server:

select a, min(b) -- or max it does not matter
from my_table
group by a

But in cases where there are many columns and the query is an ad hoc one it is very tedious to do. Is there an easy way to do it?

bobs
  • 21,346
  • 12
  • 63
  • 76
Clodoaldo Neto
  • 108,856
  • 25
  • 211
  • 247
  • Possible duplicate of [Select first row in each GROUP BY group?](https://stackoverflow.com/questions/3800551/select-first-row-in-each-group-by-group) – Michael Freidgeim Sep 28 '19 at 14:45

2 Answers2

19

You can try ROW_NUMBER, but it can affect your performance.

;WITH CTE AS
(
    SELECT *, ROW_NUMBER() OVER(PARTITION BY a ORDER BY b) Corr
    FROM my_table
)
SELECT *
FROM CTE
WHERE Corr = 1
Lamak
  • 67,466
  • 11
  • 101
  • 112
16

In addition to the accepted answer, you can avoid using two sentences and use a sub select like this

SELECT part.*
FROM (  SELECT *, ROW_NUMBER() OVER(PARTITION BY a ORDER BY b) Corr
    FROM my_table) part
WHERE part.Corr = 1