回答

收藏

SQL使用多个/相关列计算项目频率?

技术问答 技术问答 229 人阅读 | 0 人回复 | 2023-09-13

我有一个3列和数千行的表,前2列有数据。第三列当前为空,我需要根据第一列和第二列中已有的数据填充第三列。
7 q6 n( }9 E7 m0 T, y! A假设我在第一栏中有状态,在第二栏中有水果条目。我需要编写一条SQL语句来计算 每种水果来自的不同状态数
3 j1 O4 z! }& u! H1 |" v, @! U,然后将此流行度数字插入到每一行的第三列中。该行中的受欢迎程度数字1表示水果仅来自一个州,受欢迎程度数字4表示该水果来自4个州。所以我的桌子目前是这样的:, Y. ~5 @; u- t8 y
state     fruit     popularity
# O& {  @0 {: G9 d  Qhawaii    apple     
; [0 m) [* q$ j/ nhawaii    apple     
, P& E1 q* N& }hawaii    banana      
3 [6 N' \5 E7 m1 S! z; ]9 fhawaii    kiwi      9 r) z) J7 }! t* J6 a
hawaii    kiwi      + p: c- @2 k- y: H- G
hawaii    mango        ! z2 V2 [  P6 R8 W# g1 c
florida   apple      
" i* H# f+ h0 G0 u( u/ q- uflorida   apple        ' [) d! ~- N, z
florida   apple          Y% Y4 w7 G9 {3 N
florida   orange      
4 M+ J+ C: e$ m6 \+ R; T3 ^michigan  apple     
6 z$ m% v# A' {' e2 {michigan  apple     
' @! s, ]* l, Amichigan  apricot   
% A- F3 g: {1 [9 Vmichigan  orange    ' ]. ?/ b' z9 i
michigan  pear      , @& K8 F8 w* l' D
michigan  pear      
+ c1 u. b9 X: B) B0 a4 kmichigan  pear      
: F: g* ?8 p2 ttexas     apple     
$ Y# v+ p- A1 E+ z! jtexas     banana   
  z; v' \' v& Q3 P1 t! [  P4 dtexas     banana   
; f& v: w  L# Z+ Y: k+ S& E6 n2 Ctexas     banana   
$ u9 `% K4 T. Atexas     grape
! S* y+ w7 j$ I& x: _我需要弄清楚如何计算然后更新第三列,即受欢迎程度,这是出口该水果的州数。目标是生成下表(对不起的双关语),根据上表,在所有4个州中都出现“苹果”,在2个州中都出现了橘子和香蕉,而在1个州中只出现了奇异果,芒果,梨和葡萄。状态,因此它们对应的受欢迎程度数字。
# l7 ?# G9 h9 }  Z2 _$ i1 hstate     fruit     popularity+ g( U0 b) i* v- _- I  h
hawaii    apple     4/ ~4 U$ q. E! x* n9 @
hawaii    apple     4
' \2 P" k) T$ p" [6 Uhawaii    banana    2   - \0 ^; S  m. Y) M; {
hawaii    kiwi      1
% ^- C* e! ~$ L% p* z3 ]hawaii    kiwi      1
9 [9 ^" K; A. dhawaii    mango     1   
$ t! q  N+ ~0 ?# @6 w: ^& Yflorida   apple     4 . F* l. l7 N0 V6 ?
florida   apple     4   ! D$ ]( J7 D8 D, D6 D1 M- p# r
florida   apple     4     k! L  c# X0 M1 H  r. f8 X
florida   orange    2  5 s6 b* v8 @/ C+ r5 ]8 @4 ^1 F
michigan  apple     4' Q& f1 ~3 P' Z& D4 {) r
michigan  apple     4' w4 }2 T2 F3 e- o, j
michigan  apricot   1) l& _0 c9 H' O& T* f9 P1 n9 G. m3 p3 g
michigan  orange    2
% I6 o$ _. S+ w0 `9 v& u3 @- Dmichigan  pear      1
( K0 u/ m8 U/ x6 j; y/ L7 Amichigan  pear      1
  A& \) z" v5 G0 hmichigan  pear      1
3 U9 s2 U( g! n4 Htexas     apple     4
/ F6 b' U9 W/ U4 W: y( otexas     banana    2/ ^( T; K+ z# O! {* ^
texas     banana    2
7 e' Z7 V/ f% c& P- @2 D: ytexas     banana    2
. o' H1 r1 S; f! O% htexas     grape     1
7 F4 s" V" X* n1 D( p! w1 Q我小的程序员头脑说,试图找到一种在某种脚本中循环遍历数据的方法,但是对SQL和数据库有所了解,似乎您并没有在SQL中编写冗长而缓慢的循环脚本。我什至不确定是否可以?但是相反,在SQL中有更好/更快的方法可以做到这一点。
2 z5 x/ W0 E5 V7 m" |7 c任何人都知道如何在SQL语句中为每一行计算和更新第三列,在此称为流行度,并与每种水果所来自的状态数相对应?感谢您的阅读,非常感谢您的帮助。
8 |) \6 A# Y- g8 o$ s! j到目前为止,我已经在下面尝试了这些SQL语句,这些语句可以输出,但并不能完全满足我的需要:# z* Y" y/ P+ r" J* m
--outputs those fruits appearing multiple times in the table
  a* t7 S6 ?  X: z; eSELECT fruit, COUNT(*)
- Y$ N% H- q2 q- Z3 u% R  FROM table
1 P" u, a8 o2 ?  Z. a GROUP BY fruit0 |) M9 C$ G9 O: m+ w3 |+ I% o% y9 t
HAVING COUNT(*) > 1
! i1 m8 q* I4 b9 u8 B/ j4 f; i ORDER BY COUNT(*) DESC
! S0 l1 |+ `6 A8 S* E7 U4 b--outputs those fruits appearing only once in the table
6 h# q) c4 ]1 B- D6 D' q% ISELECT fruit, COUNT(*)  o7 E# H% A4 Z# ]) S. F4 v
  FROM table + U) H7 [. K- m2 N4 k' m+ E
GROUP BY fruit/ o+ {- q! X8 u. u3 U9 E6 m5 N7 o/ J8 G
HAVING COUNT(*) = 13 M; H* I- |& c7 `/ b* r
--outputs list of unique fruits in the table
7 w, c. Y# D7 ?" rSELECT COUNT (DISTINCT(fruit))
7 d9 r. _. s  \/ M, U' C( c  FROM table$ t4 ^7 D4 J/ q# P9 P( z6 [& E
                1 Y. A2 L# l: k* `# j% h
解决方案:8 d5 V6 d- D' L3 c. y
               
( {  }0 q5 g8 r
. z$ v2 b9 p( o8 s/ j8 f* @- l# j
                如果您只想使用优先级来更新表,它将看起来像:
8 `- i9 T3 H/ c" J0 |2 iupdate my_table x
$ @& Z; S: r3 D' H- Q* q0 P   set popularity = ( select count(distinct state) 3 C: b7 p5 `2 }' p$ b" H* ^6 r7 t
                        from my_table
& ^) d) c$ u, \; Q. J                       where fruit = x.fruit )
3 r6 p& c+ A; {- a' ~如果要选择数据,则可以使用分析查询:( N3 l$ r1 G# w, {: G) j
select state, fruit
: S" z& f* l. M8 A1 {4 h% [% x" N     , count(distinct state) over ( partition by fruit ) as popularity: S' b% _+ g: o; P5 P/ M
  from my_table
! I, C& K5 m- G这提供了每个水果不同状态的数量。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则