回答

收藏

SQL Server 2008:TOP 10与众不同

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

如标题所示,我使用的是SQL Server2008。如果这个问题很基础,我深表歉意。我只用了几天的SQL。现在我有以下查询:
5 b$ c( h) R0 s# Z0 vSELECT TOP 10 p.id, pl.nm, pl.val, pl.txt_val
" t. A! N5 A7 {: {1 ]( r# Rfrom dm.labs pl9 |# m0 f2 H' l, C+ \" R
join mas_data.patients p    ) C7 M. R6 R+ z: [' t2 ^- |* k1 z  J
  on pl.id = p.id3 t7 C( F* @& U  p3 w0 e/ a4 y0 D- t
  where pl.nm like '%LDL%'
, U$ L* P6 y; \* y; b* W  and val is not null
4 {, f2 b) d/ V; M& k我想做的是在ID列中使用select top n以及不同的值。在一些论坛中搜索说要使用5 k0 [3 R' v2 ?
SELECT DISTINCT TOP 10 ...
7 n' m2 R1 B: @1 l5 Q2 U但是当我将第一行替换为% A, X4 Q4 |/ x+ B1 l6 i
SELECT DISTINCT TOP 10 p.id, pl.nm, pl.val, pl.txt_val
# Y) D" w  k" i: ^3 C3 ]我得到的结果与不使用不同词的结果相同。我应该怎么做才能只过滤出重复的ID条目?2 J) C" E& g+ Y1 i( f3 `( u8 ]& t1 Y
谢谢你。; J! H8 Y1 E: q. m7 T
                ; `6 |& X* s/ P
解决方案:
3 U' q& ~; X2 C; a9 p. g                9 V' O* g# u- ]! w8 {3 M$ B5 D- j
% C6 v6 d" T( j; g/ r" x0 K! C$ i

$ ?; |2 f7 J8 D8 q; ]/ N                简单的选项是使用分组依据,并为所有其他字段选择最小值/最大值
- e: w3 y9 s' C6 m$ t" USELECT TOP 10 ! ?8 J& ^. w( I- T( d2 \! A
    p.id,
8 G7 A' a; z0 N, V7 h+ I    max(pl.nm),' v2 R. I; i3 E% u+ @4 Y* X6 k
    max(pl.val),
: Y( Z9 ]' g% k  b  t    max(pl.txt_val)
3 I5 Q* H2 M$ X% l4 m* P- cfrom / b) h, G/ l! e" z8 k* r/ J
    dm.labs pl
' a  L6 u* w7 Ojoin
& Z6 ?! u" h* g) j/ P. G  t    mas_data.patients p    , i0 c" |9 q# E; p# W8 G# a9 N8 E3 U( l9 s
on ; f* h" x4 H- g/ E( t
    pl.id = p.id
: O8 m% d/ @& a( l/ r  where ; R) ~& \9 V. Z9 L/ S+ [
    pl.nm like '%LDL%'7 g, R% ]' ~# j, F. G; a: o
and 0 d: V4 w& v) z8 \% L
    val is not null+ U5 d( M8 z* l' L  ?7 G7 ?
group by
& D1 ^9 |4 q* s& c( b    p.id, K3 b- [5 z$ o2 c/ _6 b* p
对于宽表来说这可能会很繁琐,所以另一种选择是使用排名和参与
2 A* I  K8 V5 FSELECT TOP 10 4 g' g& F) |7 H' q& ]0 o+ f
    p.id,
, d' D; s& e) l& \     pl.nm,
2 G: h0 s6 n1 ]( q6 X/ `# F     pl.val,
5 Q9 f2 D4 j* p  _& u   pl.txt_val,
3 l: e1 I6 c7 P: Z    rank() over(partition by p.id order by p.id) as Rank6 F5 \. e9 S5 C! R$ `1 s1 n
from ' A4 }0 _5 v3 s% J4 S0 M+ \
    dm.labs pl
$ M3 s& d& [/ F$ z: gjoin " k% w1 N& }" h- k; h
    mas_data.patients p   
, `7 Z5 T' q# r+ k0 S5 Hon
9 h' k) L) W- J5 X2 s* w6 Q, B) B8 S    pl.id = p.id
4 O6 _: T6 w2 N3 g6 Z) P2 P6 c9 p  where
5 K. }" f* O4 {' c    pl.nm like '%LDL%'3 j$ V3 H) ], W/ f1 o$ u( _9 ]- u
and 6 p; C9 N- _0 [8 Y0 M' p6 o7 I5 ^9 I
    val is not null0 l2 }1 n" U% L3 I. y2 J: U; i
and
" x8 ?0 [2 l& U4 b    Rank = 1
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则