回答

收藏

SQL Server 2008:TOP 10与众不同

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

如标题所示,我使用的是SQL Server2008。如果这个问题很基础,我深表歉意。我只用了几天的SQL。现在我有以下查询:
* N. v8 t! U# R+ uSELECT TOP 10 p.id, pl.nm, pl.val, pl.txt_val
$ t- I2 i& H2 N( A- c( pfrom dm.labs pl
5 D  I0 H2 ]) i7 r8 w! S9 x! a" Njoin mas_data.patients p    9 t) W# @7 U0 s2 l
  on pl.id = p.id
2 z& ]  J; g3 M  where pl.nm like '%LDL%'0 y- ^( u$ i5 Y# y1 m8 ~
  and val is not null% s. C3 q' [' w* }2 w
我想做的是在ID列中使用select top n以及不同的值。在一些论坛中搜索说要使用
, S3 x. o- O6 o* q6 BSELECT DISTINCT TOP 10 ...4 ]/ c, O  H, n0 e( u3 D" g( A1 [
但是当我将第一行替换为6 ]& P& n' i' ?( X6 x
SELECT DISTINCT TOP 10 p.id, pl.nm, pl.val, pl.txt_val! s9 x/ j" z7 \! m) r' S, B
我得到的结果与不使用不同词的结果相同。我应该怎么做才能只过滤出重复的ID条目?+ y& `  I. m* d: V# K
谢谢你。
7 D, b+ u) [% c( z# ~3 k( G1 S               
8 p6 i/ \8 V" k7 O解决方案:
( x! W( O: v: M" r! e' h) s                5 O4 ]2 h1 L; P0 \
. J& g3 w% i" d( t* y' ]4 Z9 S0 O
( s3 p* o. A% i
                简单的选项是使用分组依据,并为所有其他字段选择最小值/最大值& Z- H; l9 m# U. d0 F* |1 ]) Z6 v
SELECT TOP 10
8 J" e, v( g, I1 o  W, ^% f. y    p.id,
, T5 [5 S% y. C* Q0 s" _/ {    max(pl.nm),4 O3 w3 o0 C7 w
    max(pl.val),: n% s& |4 g3 M5 d6 p9 f
    max(pl.txt_val)
# Y7 Q# u0 [& g. I" U# l* Tfrom 9 k3 D+ O+ c% ^
    dm.labs pl# L% u- K, ?* ^( S
join / g, f+ c; k; N& c" b" ?/ U
    mas_data.patients p   
% m9 M  M$ I/ _" f! {  Yon # m: H( J" b+ F4 t! j
    pl.id = p.id4 o$ m* C. m) O5 `5 z7 Z0 e' S/ J
  where 7 v2 |, n2 I! d$ N
    pl.nm like '%LDL%'
/ n( E3 l; U+ X) ^and " p$ P$ D$ G: {/ f0 Z8 L
    val is not null% v9 P  @+ c% t% W) n
group by
9 U. F: x* F+ j+ i( `    p.id4 u& ?9 D: ~  r0 v" i
对于宽表来说这可能会很繁琐,所以另一种选择是使用排名和参与
& q( k- |) f! r5 fSELECT TOP 10 ' N# L9 p7 k* c& ~6 B2 o
    p.id,
1 f4 [: p1 c/ }     pl.nm,
& W7 B. k' P8 a$ q     pl.val, 2 H( j6 F% S+ r) e$ B; ]
   pl.txt_val,
$ y: |% i* s' L' f    rank() over(partition by p.id order by p.id) as Rank
/ g4 @/ F, `3 c$ `from 4 R+ v6 I1 O7 g( }0 }
    dm.labs pl
. a' l) t& u9 y- b, |join + B& D9 F" d$ v; d+ u) \
    mas_data.patients p   
2 q$ }; m- f( Yon
/ j* p' r0 }6 T6 p; X9 y    pl.id = p.id
- F3 {3 I' D5 }) {3 C  where
' b# j* }, F* d" {    pl.nm like '%LDL%'
6 N% h) V5 j7 U: i8 I/ j# y# p% pand
" L9 p+ T1 n: D' g! L+ {% a$ f    val is not null3 f4 j& Q" J. L" v, {' ]; x' L
and
9 U, P( @5 d/ L5 F' a, S6 {; [    Rank = 1
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则