|
如标题所示,我使用的是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 |
|