|
如标题所示,我使用的是SQL Server2008。如果这个问题很基础,我深表歉意。我只用了几天的SQL。现在我有以下查询:
2 i$ U! U& } ^9 JSELECT TOP 10 p.id, pl.nm, pl.val, pl.txt_val
5 _" }. y/ k; s' Dfrom dm.labs pl, c/ c( c w" Y; G- Q9 E
join mas_data.patients p
" ?# k. K6 f7 M x: Z# e o on pl.id = p.id6 C/ f+ i- J( E! x5 T
where pl.nm like '%LDL%'" g1 n2 p2 y* s! d4 a1 U3 q# g
and val is not null1 l- w& ?( S( @ p
我想做的是在ID列中使用select top n以及不同的值。在一些论坛中搜索说要使用0 c& q+ ~! @ K) h
SELECT DISTINCT TOP 10 ...
3 T$ C. Y- Y+ c" r6 Z) R但是当我将第一行替换为% L8 |3 \. V. a: r% r8 g
SELECT DISTINCT TOP 10 p.id, pl.nm, pl.val, pl.txt_val
! u8 L9 Y" t+ Z7 G" ^' N/ q我得到的结果与不使用不同词的结果相同。我应该怎么做才能只过滤出重复的ID条目?
) f$ G9 C" O! R% W谢谢你。, O( \9 u! e$ t8 B
" E/ m, C# g; N7 `( y解决方案:
; L8 T. \) K; `
# S& ?6 B2 @3 X8 M0 L" q" |( b( i4 {) B1 R
; V/ `, T; ]$ J( Z. L
简单的选项是使用分组依据,并为所有其他字段选择最小值/最大值$ M( ]5 ^( O; _' O+ V
SELECT TOP 10
2 T7 j0 I& G9 t/ P% E% Z7 u& @ p.id,
, x' E; I4 V! [$ j- e max(pl.nm),
( L( p5 n8 t3 V max(pl.val),
/ A/ X6 |2 L8 A; K/ i; j max(pl.txt_val)
6 i# `4 {; y! Rfrom ! i; h; L! d2 w; n- U4 y& d" x
dm.labs pl2 j$ D% p" \ N" k L/ v* D' B/ ~
join
4 x2 O7 `) _+ F0 O+ d+ p0 t0 j Q! B mas_data.patients p 9 x7 ?- q) z, F0 f% X( ]
on
1 L" a6 w% ^, i1 J$ ]( M pl.id = p.id
5 X3 w4 O( D5 j# b, P# O. w where * [3 F# G/ e' f* J
pl.nm like '%LDL%'
: b K Z, j( H4 P4 b6 Q, Pand
( w/ }' c2 z, I7 E1 k- b- I) |2 S6 h val is not null3 M/ u0 z3 ? [0 l F5 {
group by
, A+ [; A9 I k. X% d3 p: Z( m p.id
3 |+ V8 a7 \6 T7 m* @: w8 h* |对于宽表来说这可能会很繁琐,所以另一种选择是使用排名和参与
# C! L. O: H$ g5 V4 S3 w5 ]SELECT TOP 10 @; _' v% o3 G) s
p.id,
# N9 e1 ^( ^+ q1 k% ?/ S, m pl.nm, 1 [7 x9 Z+ E; ]' c
pl.val, , j" T6 q7 V$ X* h: c
pl.txt_val,
) y3 [9 @# j4 Y' Z( k rank() over(partition by p.id order by p.id) as Rank9 f* G% P' u4 V( l
from ) l: U4 @5 |* @. x
dm.labs pl
2 c( ~) m. F3 R: d( c( R. Vjoin
; s, q5 q6 {; U. d4 v( O mas_data.patients p
) ^' \8 T6 W' R( N2 aon
) U9 X0 `+ ^/ |$ i pl.id = p.id
5 K% k+ m- V7 a8 s' J: d where
. H) V5 Y% u3 G k( C! o; Q pl.nm like '%LDL%'
% C1 |& a* S$ A% v9 fand
- A5 _! ?: u2 `4 W val is not null8 N, [% ]: u0 `2 J6 q
and& b* y3 G* t/ C( C! E
Rank = 1 |
|