sql獲取某列出現頻次最多的值 業務硬核SQL集錦

2021-10-18 00:02:37 字數 4007 閱讀 8924

戳上方藍字關注我

這兩年學會了跑sql,當時有很多同學幫助我精進了這個技能,現在也寫成乙個小教程,反饋給大家。

適用物件:工作中能接觸到sql查詢平台的業務同學(例如有資料查詢許可權的產品與運營同學)

適用場景:查詢hive&mysql上的資料

文件優勢:比起各類從零起步的教程教材,理解門檻低,有效資訊密度大,可以覆蓋高頻業務場景。   

文末有一些常見的小技巧,希望幫助同學們提公升工作效率。

select                             a,b,c         --select後面輸入需要查詢的字段fromα.table        --from後面輸入需要查詢的表名wheredate='yymmdd' --where後面輸入需要卡的條件,例如只看哪天的資料
select                             a,b,c         --select後面輸入需要查詢的字段fromα.table       --from後面輸入需要查詢的表名where         date='yymmdd' --where後面輸入需要卡的條件,例如只看哪天的資料and           --表示要看date='yymmdd' 且id='***'id=***
select                             a,b,c         --select後面輸入需要查詢的字段fromα.table        --from後面輸入需要查詢的表名where         date='yymmdd' --where後面輸入需要卡的條件,例如只看哪天的資料and           (id=***or d_id=***)   --表示要看date='yymmdd' ,且id是***或d_id是***的資料。如果沒有這個括號,表示的是要看date是yymmdd且id是***,或者不分日期,d_id是***的資料
select        --select後面輸入需要查詢的字段a,b,sum(c)    --需要加和的c欄位(指標)括起來加sum即可,有點像excel那種fromα.table        --from後面輸入需要查詢的表名where         date='yymmdd' --where後面輸入需要卡的條件,例如只看哪天的資料and           (id=***or sp_id=***)   --表示要看date='yymmdd' ,且id是***或sp_id是***的資料。如果沒有這個括號,表示的是要看date是yymmdd且id是***,或者不分日期,sp_id是***的資料group by a,b  --沒有被處理的字段(維度),需要在尾部group by 一下
select        --select後面輸入需要查詢的字段a,b as b1,sum(c) as c1   --需要加和的c字段括起來加sum即可,有點像excel那種;這裡用as把b重新命名成了b1,把c重新命名成了c1fromα.table        --from後面輸入需要查詢的表名where         date='yymmdd' --where後面輸入需要卡的條件,例如只看哪天的資料and           (id=***or sp_id=***)   --表示要看date='yymmdd' ,且id是***或sp_id是***的資料。如果沒有這個括號,表示的是要看date是yymmdd且id是***,或者不分日期,sp_id是***的資料group by a,b  --沒有被處理的字段,需要在尾部group by 一下;被重新命名的維度字段,group by時仍用as前面的內容
select        --select後面輸入需要查詢的字段a,b,sum(c),   --需要加和的c字段括起來加sum即可,有點像excel那種count(distinct d)--去重查詢在a,b列舉下,d有幾個,例如查ka,la(a)的客戶id(b)下,總共有幾個廣告主(d);不加distinct查詢的是所有的廣告主(d)總共出現了幾次fromα.table        --from後面輸入需要查詢的表名where         date='yymmdd' --where後面輸入需要卡的條件,例如只看哪天的資料and           (id=***or sp_id=***)   --表示要看date='yymmdd' ,且id是***或sp_id是***的資料。如果沒有這個括號,表示的是要看date是yymmdd且id是***,或者不分日期,sp_id是***的資料group by a,b  --沒有被處理的字段,需要在尾部group by 一下
select cnt,count(id)from(select id,count(*) as cnt  ---'*'可以用來查詢行數from α.tablewhere date ='20190928' and label='show'group by id) a                          ---這裡寫乙個'a',用來給3到7行的結果命名,這樣外層的sql才能識別括號裡面的內容group by cnt
select a,b,cfrom(select a,sum (b)  from a group by a) cost                ---為3到6行的sql命名為costleft join (           ---這裡使用左連線select a,cfrom b group by a,c )text    ---為8到10行的sql命名為texton cost.a=text.a      ---這裡需要寫清連線兩段sql的字段
(**於網路,侵刪)

select a,sum (b),if (label = 'show_over', duration, 0) --這一句的意思是,當這一行資料的label是show_over的時候,取duration這個欄位裡的值,label不是show_over的時候,取0from a group by a

select a,sum (b),case when label = 'pv' then durationwhenlabel='play' then mockdurationelse 0end, --2到4行的意思是,當這一行資料的label是pv的時候,取duration這個欄位裡的值,如果label是play的時候,取duration這個欄位裡的值,如果還沒有,就取0from a group by a
select a,floor (x/100)  ---把x按100分檔,0檔表示x在[0,100)之間,1檔表示x在[100,200)之間,以此類推from a group by a
select a,sum (b)from a where type is not null --找出type 不是null的情況,不加"not",就是找出type 是null的情況group by a
select a,sum (b)from a where type='1'   ---string加單引號group by a
select a,sum (b)from a where type=1l    --- bigint後加lgroup by a
select a,sum (b)from a where array_contains(model,123l)group by a
select get_json_object(data,'$.a.b') from a
檢查相關表的分割槽,和你取的分割槽一致不一致,例如日期有多種格式,例如yymmdd,yy-mm-dd,yy-mm-dd 00:00:00等等;

如果sql包含多個部分,比如有join,可以把其他部分的sql注釋掉,分別看每個部分的sql**有問題;(注釋方式:**前加「--」  例如  --select ...)

SQL語句之計算次數出現最多的值

需求,計算20號部門員工工資出現的次數 使用count 函式 sql select sal,count time from emp where deptno 20 group by sal sal time 2975 1 1100 1 3000 2 800 1 sql 12 3456 78910 計...

獲取某行某列的值

獲取某行某列的值 迴圈方式 param row 行數 param col 列數 return number function getval row,col tmp arr for i 1 i row i else return tmp arr row col echo getval 6,2 獲取某行...

獲取某行某列的值

獲取某行某列的值 迴圈方式 param row 行數 param col 列數 return number function getval row,col tmp arr for i 1 i row i else return tmp arr row col echo getval 6,2 獲取某行...