回答

收藏

SQL Server 2008:TOP 10与众不同

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

如标题所示,我使用的是SQL Server2008。如果这个问题很基础,我深表歉意。我只用了几天的SQL。现在我有以下查询:
" n# t# @6 p  W- I1 hSELECT TOP 10 p.id, pl.nm, pl.val, pl.txt_val: A  z; u9 Y: c' \
from dm.labs pl
" O. w( B9 Y$ \9 Q& J: v& D) M3 J( Xjoin mas_data.patients p    * K+ b" o+ n) b. t& ?9 z
  on pl.id = p.id
0 P+ v" q' P" ^7 _6 R  where pl.nm like '%LDL%'
! g& {8 l- E. a2 S6 b0 E  and val is not null
- d1 _1 c/ j" q8 j- P我想做的是在ID列中使用select top n以及不同的值。在一些论坛中搜索说要使用
* p& p3 \; n5 c4 R: Z  G. q  nSELECT DISTINCT TOP 10 ...2 P) u2 b' ~7 ]. }6 V( i6 l
但是当我将第一行替换为
: Q# X$ |: i$ J/ R0 i! D, cSELECT DISTINCT TOP 10 p.id, pl.nm, pl.val, pl.txt_val
5 K8 L! l0 l+ g2 E) C! V1 q. d7 O. c我得到的结果与不使用不同词的结果相同。我应该怎么做才能只过滤出重复的ID条目?
1 o+ ~7 z; @8 L  b' j谢谢你。
7 r! K- H0 k4 |, n6 t                8 S$ i9 f) Q. p% G
解决方案:
* P/ z1 ^2 h0 P+ g9 _                8 P7 V9 s, p5 V% E& n4 k
+ i! `3 X" n; ^- p9 B

$ L/ E4 C4 M% u& e                简单的选项是使用分组依据,并为所有其他字段选择最小值/最大值
4 E5 j. B  k3 F  I+ uSELECT TOP 10 1 M  v! t& U+ _& Y+ U7 N
    p.id, / K9 W$ J! r1 c  W4 Y' h
    max(pl.nm),' [9 p+ k* w. c% F+ p2 p
    max(pl.val),  x" o( K8 d5 e' S. I. h
    max(pl.txt_val)/ q$ ^; T  f+ D4 w! G: k2 K. I- X3 L
from
) x* ^1 D& p% H' T' E: ~% r1 p    dm.labs pl
/ m) U0 X3 o9 I8 Ujoin 9 K% a9 g" {+ J7 o( |
    mas_data.patients p   
- m3 v$ N6 w) N) P% Z, J4 J0 zon 4 V/ \5 e; G8 q% p9 H
    pl.id = p.id
  I' }+ j0 \$ |  where
7 U9 s/ Q4 F+ a0 F, N; u    pl.nm like '%LDL%'
% `& `+ N# I$ K* W& }2 h! D8 F0 Band 5 C. {5 w- Q& G. I. N
    val is not null1 G+ h4 b# z; G7 [8 p( k; C
group by
( @5 i- r7 K/ L0 |9 c    p.id4 i! f2 g8 u; z
对于宽表来说这可能会很繁琐,所以另一种选择是使用排名和参与4 E& Q3 [3 H& Z# `
SELECT TOP 10 / L% Y; ^* A0 P- R
    p.id, ; U6 j6 [  [6 \7 h/ L. c
     pl.nm, ) u. U0 t8 r$ u$ w, s, y
     pl.val, 1 }3 O* A" g$ }- ~- A' R
   pl.txt_val, 8 d1 N' n, T$ b" M' u2 t
    rank() over(partition by p.id order by p.id) as Rank' i: S6 e$ x* N2 X% a8 R
from
4 y1 ?: p( E0 C' H    dm.labs pl
* h7 Y+ g" T1 b! V, W% S5 l* r! \" u6 rjoin 6 D: Y, \. A6 A* j# W6 q6 J/ m7 X
    mas_data.patients p    % r$ Q4 Z8 x" l  W% ~
on
  c$ A! s0 z6 D  t    pl.id = p.id# @7 K+ v. _, G; Q1 N, ?6 q
  where $ G  |& P3 T. p3 l$ i5 R
    pl.nm like '%LDL%'
; a* ~5 W9 H+ fand 5 F; ?3 v1 p- N# v( i: q6 D* O% Z
    val is not null
3 I! b$ R4 B0 S, M  a  `( x5 I" Jand7 B/ e3 r9 Q- H7 S
    Rank = 1
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则