SQL Server相当于PostgreSQL上的()

时间:2011-04-27 18:36:39

标签: sql sql-server sql-server-2008

我想要一个与PostgreSQL distinct on ()

等效的Sql Server
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

我可以在SQL Server中执行:

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

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

2 个答案:

答案 0 :(得分:12)

您可以尝试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

答案 1 :(得分:8)

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

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