sql count用法_SQL是一门手艺
SQL不是一門語言,而是一門手藝。
把SQL當手藝來學
1.行列過濾
2.數據變換
3.合并連接
4.聚合透視
奇怪的用法
把SQL當手藝來學
所謂手藝,要求心手相連,每一門手藝的背后,都閃現著手藝人的心血與智慧。SQL也是。
SQL: Structured Query Language,結構化查詢語言。實際上也有戲稱是標準查詢語言的,并不為過,SQL誕生于1974年,基于關系數據庫(也就是表格),發展至今毫無衰落跡象,反而滲透到各個數據處理工具/系統中:傳統數據庫、Hive數據倉庫、MongoDB支持類SQL,甚至玩dataframe表格的R語言也可以通過sqldf包寫sql,Spark、Flink也可以寫SQL,等等。玩數據分析,學好SQL無往而不利。
如果把SQL當語言來學,那么學習路徑是單詞、語法、技巧,學完后一團亂麻?
當手藝來學,就要先修內功——分析思路,再按分析所需的功能學用法,將會無比通暢。試想我們拿到表格形式的數據,要怎么操作分析?16個字:
行列過濾、數據變換、合并連接、聚合透視
以下以hive為例來說,先簡化幾個表:
1. 行列過濾
select seword? --列過濾 from ks.selog where uid=1002 ?--行過濾 |
| 搞笑視頻 |
從ks.selog表格中找出uid=1002的行中的 seword列。簡直就是自然語言啊,你說氣人不~
from一個表,select結果也是個表。
2.?數據變換
select os, case os when 'iphone'?then 1 when 'android'?then 2 end as osid from ks.selog |
iphone,?1 iphone, 1 android, 2 |
利用case-when將os變換成id。現在看這一串單詞就不覺得頭疼了吧。
大部分SQL教程會堆砌各種函數、語法,不怕,我們知道都是為了做數據變換,分門別類的來看:
- 字符串函數:
? ? length(),變upper(),截substr(),拆split(),拼concat()…
- 數值計算:
? ? +-*/模%,舍入round(),隨機rand(),取整ceil()floor(),數學sin()…
- 日期函數:
? ? year(),month(),day(),minute(),date_add()…
- json抽取:?
? ? get_json_object('{"button":"cancel"}','$.button') 得到cancel
- url參數抽取:
? ? ?parse_url(a_url, 'HOST'), parse_url(a_url, 'QUERY' , 'speachid')
- 字典取KV:?
? ? event_urlparams['speachid']
- 數組取元素:
? ??displayresult[1] 第一條展現結果
- if函數,case子句
- 類型轉換: cast('2' as int)?
3.合并連接
select t1.uid, word, gender from ( select uid,seword word from ks.selog union all select uid,sdword word from ks.sdlog ) t1 join ( select uid,gender from ks.profile ) t2 on t1.uid=t2.uid |
1001,手工耿, 男 1001,央視直播,男 1002,搞笑視頻,女 1002, 央視新聞,女 |
稍微復雜些了。來看其中的關鍵點,
union all ,將2個格式一致的select查詢結果合并。
子查詢 () t ,用括號包含查詢語句并命名為t,查詢結果是一個表格,這是一個隱含表,可以被select。
Join on,把2個表按某個字段連接起來,把右表中的信息連到左表上。
不沉溺于sql中的關鍵字,用輸入一個表操作后輸出一個表來看,畫一下這個過程
4.聚合透視
select os,sum(1) sepv,count(distinct uid) seuv from ks.selog group by os |
iphone, 2, 1 android, 1, 1 |
聚合指按某幾列聚合group by,得到的結果是維度列os和指標列sepv計數、seuv去重計數。指標列由聚合函數計算得到,指標列可以直接計算。
透視不是sql強項,一般通過SQL得到聚合的數據,在Excel、Pandas進行透視
16字說完了,其中合并連接是最強大之處,多個表格在不同的地方,非常常見,在SQL里只管按需union join即可。union?好說,列名一致就行,join則會面臨左右表要連接的字段參差不齊,也就引申出好多種join,只記基礎的3種足夠用
現在挑戰一下
select gender,case when cate is NULL then '其他' when cate='發明' then '發明創造' else cate end as newcate, ? ? count(1) pv,count(distinct t1.uid) uv,count(1)/count(distinct t1.uid)/1000 avgpv_k, ? ? sum(if(t3.cate is NULL,0,1)) useless from? ( select uid,upper(seword) word from ks.selog? union all? select uid,upper(sdword) word from ks.sdlog? ) t1 join ( select uid,if(gender is not NULL,gender,'') gender from ks.profile ) t2 on t1.uid=t2.uid left outer join ( select distinct word,cate from ks.query_cate ) t3 on t1.word=upper(t3.word) group by gender,case when cate is NULL then '其他' when cate='發明' then '發明創造' else cate end |
現在看這一坨臭長的中英文字符還是亂碼嗎?
[我們理解了1+1=2,那么就很容易理解復變函數和切比雪夫不等式啦 @_@||-_-||]
奇怪的用法
qg1:透視
為了吹SQL,還是寫一下sql的透視,閑的慌
select os,? ? ? count(if(p_date=20201111,seword,NULL)) c20201111,? ? ? count(if(p_date=20201119,seword,NULL)) c20201119 from ks_mmu.selog group by os |
啥時候會這樣枚舉結果列?比如數據量很大,Excel搞不定了,又很明確有哪些列可以枚舉。比如要對一天內用戶的活躍小時進行聚類分析,要得到 就可以這樣寫sql。
qg2:hive借java能力做數值變換
| select reflect("java.lang.Math", "round", 2.5) |
就問騷氣不騷氣~
qg3:寫python代碼嵌入sql執行
# python代碼,存儲為 x.py import sys os_id={"iphone":1, "android":2} for line in sys.stdin: ??? fs=line.rstrip("\n").split("\t") ??? os=fs[0] ??? osid=os_id.get(os, 0) ??? print "%s\t%s"%(os, osid) |
hive -e" add file ./x.py;? --定位到所寫腳本 select TRANSFORM(os) -- 將原始列傳給x.py USING 'python x.py'? --用x.py逐行處理并輸出 as (os string,osid string) --腳本輸出的\t分割的各列新名字 from ks.selog --其他sql語法不變 " |
iphone, 1 iphone, 1 android, 2 |
再問是不是更騷氣~
qg4:行列互轉
最后總結一下:
1.行列過濾
2.數據變換
3.合并連接
4.聚合透視
這不是一篇教程,要教程是官網看,詳細到每一個關鍵字,夠看好幾天;
這只是一個視角。
不要滿腦子想select from where group,而想我要對表格的數據做什么,SQL這個工具能幫我,工具練熟了心手合一,就掌握了一門手藝。
荒年餓不死手藝人
總結
以上是生活随笔為你收集整理的sql count用法_SQL是一门手艺的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 负数如何归一化处理_小白的图像处理入门(
- 下一篇: 安装不文件不完全_冬日不偷懒 跑步机不完