回答

收藏

与()上的PostgreSQL等效的SQL Server

技术问答 技术问答 252 人阅读 | 0 人回复 | 2023-09-14

我想拥有一个与PostgreSQL等效的Sql Server distinct on ()
9 a: R  s) V9 C: o% n$ Ga  b2 g1 c( r: J7 E: j4 G7 a
----
: i7 {- p9 Q) {+ s% h3 {7 W1  1) u& F; _2 B3 G2 N' V) U2 U
1  2
- I- H1 w! ]& ^, r2 s+ b2  2
2 E- t2 ^- |3 v$ X3 N* }& K/ J. `/ h2  18 k# n( ?' i$ v& L) @
3  3
& Y7 D$ B! a+ s% Lselect distinct on (a) *
# P4 Q& `. T7 ]1 i4 P- ifrom my_table8 `, d: A( E: U8 ~# p9 v) K
a  b
# I- v5 x' L9 {----
0 I0 y& t2 _9 a. g' l1  1) A/ W4 ?) H5 P+ K* l: m
2  2
7 r% k. d1 ~9 B% l8 V0 x) L3  37 X# ~. F% J# L
我可以在SQL Server中执行以下操作:- k" D* |$ Y4 o( ]* Q% G
select a, min(b) -- or max it does not matter* W# ]  u+ f9 W# s
from my_table
+ ]3 ]8 B+ M$ u  v$ \group by a( W. M! `. B6 c5 N& D3 I7 ^
但是,在有许多列并且查询是临时查询的情况下,这样做非常繁琐。有一个简单的方法吗?
0 m4 Z/ N8 U) \9 U                / F4 v+ t  B' K. Z
解决方案:
. u* E, F$ a! d) ~/ ~. {/ S               
+ z7 {: N: M' l9 }
$ B/ b8 k5 O6 M9 t: Z
! t, A9 {+ O) y+ Y: ~% T                您可以尝试ROW_NUMBER,但它可能会影响您的性能。+ v0 V& v  w) O, I5 g0 D7 g
;WITH CTE AS
- i* y' U+ `  z1 o/ N(9 t8 ~* [/ N( Q6 I* h% @
    SELECT *, ROW_NUMBER() OVER(PARTITION BY a ORDER BY b) Corr+ A$ {; J$ A. B8 G
    FROM my_table
: }' r, w+ h4 N! B)
8 a. }  X2 C' q/ f' [/ ]SELECT *
) [  B; e" [" n/ t2 D1 dFROM CTE7 [( t! t7 Y, w9 Q# f8 ]4 `
WHERE Corr = 1
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则