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

戳上方藍字關注我?5cd59ed7b47a25229f7f668608f1e363.gif

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

? ? 適用對象:工作中能接觸到sql查詢平臺的業務同學(例如有數據查詢權限的產品與運營同學)

? ? 適用場景:查詢hive&mysql上的數據

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

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

  • SQL的基礎結構:

    • 做一個類比,我們用的“表”,就像是一個賬本,每天就是一個“分區”,“字段”就是日記上記的不同的事情,例如支出、收入、物品和價格等;

    • 一般來講sql有如下結構,意思是從表α.table里面,獲取某一天的abc三個字段,后面的講解都是在這個基礎上展開的:

select                             a,b,c         --select后面輸入需要查詢的字段fromα.table        --from后面輸入需要查詢的表名wheredate='yymmdd' --where后面輸入需要卡的條件,例如只看哪天的數據
  • 多個條件同時生效-and和or

    • and的用法--表示多條件同時生效

select                             a,b,c         --select后面輸入需要查詢的字段fromα.table       --from后面輸入需要查詢的表名where         date='yymmdd' --where后面輸入需要卡的條件,例如只看哪天的數據and           --表示要看date='yymmdd' 且id='XXX'id=XXX
    • or的用法--表示有一個條件生效即可

select                             a,b,c         --select后面輸入需要查詢的字段fromα.table        --from后面輸入需要查詢的表名where         date='yymmdd' --where后面輸入需要卡的條件,例如只看哪天的數據and           (id=XXXor d_id=XXX)???--表示要看date='yymmdd'?,且id是xxx或d_id是xxx的數據。如果沒有這個括號,表示的是要看date是yymmdd且id是xxx,或者不分日期,d_id是xxx的數據
  • 對指標進行加和--sum

    • 學習到本節時,我們需要明白維度和指標的區別,維度是表示屬性的,指標是表示量級的,例如全中國有56個民族,全中國就是一個維度,民族數量就是一個指標

select        --select后面輸入需要查詢的字段a,b,sum(c)    --需要加和的c字段(指標)括起來加sum即可,有點像excel那種fromα.table        --from后面輸入需要查詢的表名where         date='yymmdd' --where后面輸入需要卡的條件,例如只看哪天的數據and           (id=XXXor sp_id=XXX)   --表示要看date='yymmdd' ,且id是xxx或sp_id是xxx的數據。如果沒有這個括號,表示的是要看date是yymmdd且id是xxx,或者不分日期,sp_id是xxx的數據group by a,b  --沒有被處理的字段(維度),需要在尾部group by 一下
  • 為字段重新命名--as

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=XXXor sp_id=XXX)   --表示要看date='yymmdd' ,且id是xxx或sp_id是xxx的數據。如果沒有這個括號,表示的是要看date是yymmdd且id是xxx,或者不分日期,sp_id是xxx的數據group by a,b  --沒有被處理的字段,需要在尾部group by 一下;被重新命名的維度字段,group by時仍用as前面的內容
  • 查數據條數,或查詢維度的數量--count和distinct

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=XXXor sp_id=XXX)   --表示要看date='yymmdd' ,且id是xxx或sp_id是xxx的數據。如果沒有這個括號,表示的是要看date是yymmdd且id是xxx,或者不分日期,sp_id是xxx的數據group by a,b  --沒有被處理的字段,需要在尾部group by 一下
  • 對一份數據做多次處理--嵌套結構

    • 如下sql查詢了每個人在當天的頁面訪問頻次。3到7行先查詢出每個用戶id的頁面訪問頻次,然后使用3到7行的結果,查詢每個訪問頻次下,有幾個id:

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
  • 對多份數據做關聯處理--join

    • 最常用的場景:假設表A上有門店id是a,收入是b,表B上有門店id是a,門店名稱c,如果需要獲取門店id,收入,門店名稱的關系,可以這么寫:

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的字段
    • 放下這張圖,形象的表達了各種join方法,獲取的數據范圍。想獲取對應數據時,替換上邊第7行就可以用:?e9965a173591e0dcb550693b987555ea.png

(圖片來源于網絡,侵刪)

  • 條件判斷,對同一個字段做區分計算--if 和case when

    • 判斷一次是否--if

select a,sum (b),if (label = 'show_over', duration, 0) --這一句的意思是,當這一行數據的label是show_over的時候,取duration這個字段里的值,label不是show_over的時候,取0from A group by a
    • 判斷一次或多次是否--case when

      • 多加判斷的方式見4和5兩行:

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
  • 除法取整--floor

select?a,floor?(X/100)??---把X按100分檔,0檔表示X在[0,100)之間,1檔表示X在[100,200)之間,以此類推from A group by a
  • 篩選字段為空/不為空的方法--null

select a,sum (b)from A where type is not null --找出type 不是null的情況,不加"not",就是找出type 是null的情況group by a
  • 各種常見類型字段、指定值的查詢方法:

    • string:加單引號即可,例如一個字段type是string,就可以寫:

select a,sum (b)from A where?type='1'???---string加單引號group by a
    • bigint:后面加一個L,例如一個字段type是bigint,就可以寫:

select a,sum (b)from A where?type=1L    --- bigint后加Lgroup by a
    • array:XXX代表數組內的字段類型,需要根據此類型的方式取數,假設model字段的類型是array:

select a,sum (b)from A where array_contains(model,123L)group by a
    • json:json經常會出現字段包字段的情況,例如常用的data是個json字段,里面會有a字段,a字段里面還會有b字段,如果想取出b,我們應該這么寫:

select?get_json_object(data,'$.a.b')?from A
  • 擴展閱讀

    • 一些提升效率的方法

      • 時間分區有多種存儲方式,查詢where條件的時候需要注意:有的表是‘yymmdd’,有的表是‘yy-mm-dd’;字段名也不固定,有的表是p_date,有的表是date,但是對于單個表,分區字段一般是固定的,例如你經常查a.bcde這個表,上次他的時間分區格式是date=‘yymmdd’,下次查的時候它還會是date=‘yymmdd’;

      • 有時表中的時間戳不是常見的yymmdd,而是一串數字,如果where條件里需要卡時間戳,卻不知道日期對應的一串數字是什么,可使用時間戳轉換器轉換:https://tool.lu/timestamp/

      • sql沒數、跑錯怎么辦:有時解析功能沒有發現問題,但是數據直觀感覺不對,可以用如下方式自查:

        1. 檢查相關表的分區,和你取的分區一致不一致,例如日期有多種格式,例如yymmdd,yy-mm-dd,yy-mm-dd 00:00:00等等;

        2. 如果sql包含多個部分,比如有join,可以把其他部分的sql注釋掉,分別看每個部分的sql哪里有問題;(注釋方式:代碼前加“--” ?例如 ?--select ...)

      • 需要研究單個json字段的邏輯:可以用這個網址整理json字段,方便閱讀:https://www.json.cn/

      • 同時編輯多行,可以按住shift+alt/option,鼠標點擊起始行和結束行,就能同時編輯多行了,例如批量

    • 常用概念的解釋

      • 全量表和增量表

        • 增量表:每天存下來的數據,是當天產生的所有數據,例如日記,每日走路的步數,銀行每天的收支信息等;

        • 全量表:每天存下來的數據,是從有表開始所有的數據,相當于每天抄一份歷史上所有的日記,再寫今天的日記,例如銀行賬戶的余額;

      • 不同數據庫的區別

        • mysql等實時查詢的數據庫:一般沒有分區概念,存儲的數據比較少,但是響應快;

        • hive等離線查詢數據庫:有分區概念,可以較低成本的存儲海量數據,支持各種復雜處理,查詢速度一般比mysql慢。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/397756.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/397756.shtml
英文地址,請注明出處:http://en.pswp.cn/news/397756.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

void ,NULL與0的區別聯系

void ,NULL及0的區別聯系 void的詳解: void的字面意思是“無類型”或“空類型”,void*則為“無針型指針”,那就意味著void*可以指向任何類型的數據。 眾所周知,如果指針p1和p2的類型相同,那么我們可以直接在p1和p2間互相賦值&…

python 2 days

1,格式化輸出,%s %d 2,復習昨日講題 編譯型: 將代碼一次性全部編譯成二進制,然后運行。 優點:執行效率高。 缺點:開發效率低,不能跨平臺。 C解釋型: 代碼…

nginx編譯安裝與配置使用

第一部分----nginx基本應用源碼編譯安裝nginx1、安裝pcre軟件包(使nginx支持http rewrite模塊)yum install -y pcre yum install -y pcre-devel2、安裝openssl-devel(使nginx支持ssl)yum install -y openssl-devel3、創建用戶ngin…

ubuntu+查看服務器文件夾權限,Ubuntu - 文件夾權限查看與修改

Ubuntu 文件的歸屬身份有四種:u - 擁有文件的用戶(所有者)g - 所有者所在的組群o - 其他人(不是所有者或所有者的組群)a - 每個人或全部(u, g, o)1. 查看文件/文件夾權限ls -l filename # 查看文件權限ls -ld folder # 查看文件夾權限輸出結果如:drwxrwx…

mysql dump 1449_跨版本mysqldump恢復報錯Errno1449

已經有一套主從mysql,新增兩個slave主庫Server version: 5.6.22-log MySQL Community Server (GPL)舊從庫Server version: 5.6.28-log MySQL Community Server (GPL)新增SLAVE 1: Server version: 5.6.22-log MySQL Community Server (GPL)新增SLAVE 2: …

修復 Xcode 錯誤 “The identity used to sign the executable is no longer valid”

如圖: 解決方法來自:http://stackoverflow.com/questions/7088441/the-identity-used-to-sign-the-executable-is-no-longer-valid/14275197 Restarting Xcode didnt work for me. What fixed it for me was going to Accounts in Xcode (in preferences…

centos設置ip

這里是centos7.vmware安裝centos后需要設置ip 1.首先查看虛擬機的網絡適配器信息 2.根據信息修改配置文件 vi /etc/sysconfig/network-scripts/ifcfg-ens33 圖為修改后的,最初的配置為 BOOTPROTOdhcp ONBOOTno IPADDR,GATEWAY,NETMASK沒有進行配置需要根據網絡適配器配置手動維…

微信支付+服務器+php代碼,php 微信支付企業付款(示例代碼)

/*** 格式化參數格式化成url參數*/public function ToUrl($arr){$buff "";foreach ($arr as $k > $v){if($k ! "sign" && $v ! "" && !is_array($v)){$buff . $k . "" . $v . "&";}}$buff trim($b…

Spark踩坑記——數據庫(Hbase+Mysql)轉

轉自:http://www.cnblogs.com/xlturing/p/spark.html 前言 在使用Spark Streaming的過程中對于計算產生結果的進行持久化時,我們往往需要操作數據庫,去統計或者改變一些值。最近一個實時消費者處理任務,在使用spark streaming進行…

解決Failed to connect session for conifg 故障

服務器升級openssh之后jenkins構建報錯了,報錯信息如下: Failed to connet or change directory jenkins.plugins.publish_over.BapPublisherException:Failed to connect session for config.....Message [Algorithm negotiation fail] 升級前ssh版本&a…

78oa mysql_78oa系統版本升級方法

可升級版本預覽升級方法:1、備份數據庫、附件目錄、二次開發程序打開開始菜單——控制面板——管理工具——服務,右鍵點擊停止 78oa mysql service 服務,完整復制【D:\78OA\server\modules\storage\data\78oa】(數據庫)文件夾至備份區域。完整…

Excel導出顯示服務器意外,C# 調用Excel 出現服務器出現意外狀況. (異常來自 HRESULT:0x80010105 (RPC_E_SERVERFAULT)...

C# 調用Excel 出現服務器出現意外狀況. (異常來自 HRESULT:0x80010105 (RPC_E_SERVERFAULT)htmlprivate Microsoft.Office.Interop.Excel.Application xApp;private Microsoft.Office.Interop.Excel.Workbook xBook;服務器//變量xApp new Microsoft.Office.Interop.Excel.Appl…

列表、元組、字典、集合的定義、操作與綜合練習

l[A,B,C] t{A,B,C}l.append(B)print(l)scores[66,77,88]d{A:66,B:77,C:88} d[B]99 d[D]111 d.pop(C) print(d)s1{A,B,C} s2{A,C,D} print(s1&s2) print(s1|s2) 轉載于:https://www.cnblogs.com/chenjunyu666/p/9147417.html

xargs

find /tmp/ -name "*.log" -mtime 4 | xargs -i -t mv {} /home/ find /tmp/ -name "*.log" -mtime 4 -print0 | xargs -0 rm -f xargs(1) xargs是給命令傳遞參數的一個過濾器,也是組合多個命令的一個工具。它把一個數據流分割為一些足夠小的塊…

export mysql home_mysql的Linux下安裝筆記

注:在5.7之后MySQL不在生成my-default.cnf配置。tar -xzvf mysql-5.7.28-linux-glibc2.12-x86_64.tar.gzmv mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz/ /usr/local/mysql新建 useradd mysql新建文件夾mkdir /usr/local/mysql/data生成配置:./mysqld -…

[轉]DevExpress GridControl 關于使用CardView的一點小結

最近項目里需要顯示商品的一系列圖片,打算用CardView來顯示,由于第一次使用,遇到許多問題,發現網上這方面的資源很少,所以把自己的一點點實際經驗小結一下,供自己和大家以后參考。 1、選擇CardView&#xf…

thinkphp5 ajax搜索+分頁

<center> <table > <tr> 水果名稱<input type"text" name"f_name" class"f_name"> 水果分類 &…

EventBus學習

EventBus是android 下高效的發布/訂閱事件總線機制&#xff0c;可以代替傳統的Intent&#xff0c;Handler&#xff0c;BroadCast 或者Fragment&#xff0c;Activity&#xff0c;Service&#xff0c;線程之間傳遞數據&#xff0c;是一種發布訂閱設計模式&#xff08;觀察者模式&…

Uediter的引用和取值

頁面應用Uediter控件&#xff0c;代碼如下&#xff1a; <tr><td align"center" class"xwnr_j"><asp: TextBox ID "txtContent" TextMode "MultiLine" Height "274px" Width "95%" runat"serv…

java程序 構建mycircle類_Java語言程序設計(十九)對象和類的應用實例

1.我們定義一個Circle類并使用該類創建對象&#xff0c;我們創建三個圓對象&#xff0c;1.0&#xff0c;25和125&#xff0c;然后顯示這三個圓的半徑和面積&#xff0c;將第二個對象的半徑改為100&#xff0c;然后顯示它的新半徑和面積。程序清單如下&#xff1a;package testc…