SQL Server中与PostgreSQL的distinct on()相当的功能

29

我想要一个 SQL Server 版本的 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

在SQL Server中,我可以这样做:

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

但是,在存在许多列且查询为即席查询的情况下,这样做非常繁琐。有没有简单的方法可以做到这一点?


@MichaelFreidgeim 这个回答只是展示了 CTE 是 DISTINCT ON 的语义替代,但是在性能方面,CTE 远远落后于 Postgres 扩展。 - gavenkoa
2个回答

24

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

如果我没有使用CTE的选项,该如何做到这一点? - Nouman Bhatti
1
@NoumanBhatti 然后你将括号移动到 FROMCTE 之间。 - Radim Bača

22

除了被接受的答案外,你可以使用这样的子查询避免使用两个语句。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接