SQL Server相当于PostgreSQL上的()

Clo*_*eto 22 sql sql-server sql-server-2008

我想有一个与PostgreSQL等效的Sql Server 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
Run Code Online (Sandbox Code Playgroud)

我可以在SQL Server中做:

select a, min(b) -- or max it does not matter
from my_table
group by a
Run Code Online (Sandbox Code Playgroud)

但是在有很多列并且查询是临时查询的情况下,这样做非常繁琐.有一个简单的方法吗?

Lam*_*mak 14

你可以尝试ROW_NUMBER,但它会影响你的表现.

;WITH CTE AS
(
    SELECT *, ROW_NUMBER() OVER(PARTITION BY a ORDER BY b) Corr
    FROM my_table
)
SELECT *
FROM CTE
WHERE Corr = 1
Run Code Online (Sandbox Code Playgroud)


小智 12

除了接受的答案,您可以避免使用两个句子并使用这样的子选择

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