回答

收藏

SQL查询,用于查找表中的代表性行

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

假设我有一个付款表,如下所示:
) R. v2 x4 `8 I7 I; F7 z7 ]! VPaymentID INT,CustomerID INT,Value INT,PaidOn DATE0 r" b3 s3 }0 u  v/ C
我想查询每个客户的最高付款额。是否可以使用单个SQL查询来避免不必要地挖掘我不感兴趣的每一行-或更糟糕的是,为每个客户运行一个查询?
+ q) M7 w+ t9 r; ?1 B& y5 S. _到目前为止,我能想到的最好的方法是:7 \- P' u- [# v. f) @* H# }
从Payments GROUP BY CustomerID中选择CustomerID,MAX(Value);9 D' [/ N2 @2 z; n
但这并没有为我找到的行提供PaymentId或PaidOn值。
/ s+ d- C  s+ @3 s               
" P8 C0 K3 U4 e; d* i4 x& f# z解决方案:
4 a+ m# E* p4 ]7 g' I+ k5 E3 x                3 Q) `6 R' C/ X; B# x; e# Y; I

/ Y: d* k; v, `, ^  Z( }. u( k, n
                以下查询将完成此操作。它会拉出所有没有更大值的行。
/ ^0 N/ U5 H: ], c5 V) ZSELECT *
: j; @$ g4 r$ e* U& \% X* X4 oFROM payments p0 a9 V; C. I& D2 W+ y5 K; b
WHERE NOT EXISTS (
. G/ e% o+ q# r, Y6 g8 `    SELECT *
6 J' x# w1 T# u+ ]" R; G    FROM payments p26 k: q9 r+ {: u& o. {/ P7 M6 d
    WHERE p2.CustomerID = p.CustomerId
+ z! u1 ~+ t+ S$ P" L9 G    AND   p2.Value > p.Value% i+ j( ^5 ^9 N
)
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则