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.mzph.cn/news/397756.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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…

修复 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没有进行配置需要根据网络适配器配置手动维…

解决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】(数据库)文件夹至备份区域。完整…

列表、元组、字典、集合的定义、操作与综合练习

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

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…

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…

hiho图的联通性(自留)

无向图割边割点算法 而当(u,v)为树边且low[v]>dfn[u]时&#xff0c;表示v节点只能通过该边(u,v)与u连通&#xff0c;那么(u,v)即为割边。 1 void dfs(int u) {2 //记录dfs遍历次序3 static int counter 0; 4 5 //记录节点u的子树数6 int children …

《Git权威指南》笔记2

2019独角兽企业重金招聘Python工程师标准>>> ###Git克隆 Git使用git clone命令实现版本库克隆&#xff0c;主要有如下3种用法&#xff1a; 1&#xff09;git clone <repository> <direcctory> 将repository指向的版本库创建一个克隆岛directory目录。目…

SQL数据库挂起 SQL数据库附加报错 SQL数据库824错误修复

SQL数据库挂起 SQL数据库附加报错 SQL数据库824错误修复 数据类型 MSSQL 2012数据大小 4.5 GB故障检测 附加数据库提示824错误 一般是由于断电非法关机导致页面损坏。客户要求 恢复数据库数据 ERP可直接使用。修复结果 文件传来后 检测发现页面没有及时正常关闭导致SQL认为页不…

爬虫实战篇---12306抢票爬虫

&#xff08;1&#xff09;、前言 &#xff08;此代码经过我的实测具有较强的实用型)每逢佳节&#xff0c;大家对于回家抢票这件事是不是特别头疼呢&#xff1f;今天我在网上发现了这个代码&#xff0c;通过一天的学习&#xff0c;与大家分析下&#xff0c;大家可以直接拿来进行…

2018美团CodeM编程大赛 Round A Problem 2 下棋 【贪心】

应该一眼看出来是贪心题&#xff0c;然后想最优解是什么。正确的贪心策略是【原棋盘上每个位置的棋子】都往最近的左边【目标棋盘上棋子】移动&#xff0c;如果左边没有棋子了那就闲置最后处理&#xff0c;如果目标棋盘在该位置上也有棋子&#xff0c;那就算距离为0&#xff08…

nginx 二进制包安装mysql_二进制安装mysql5.7

下载地址&#xff1a;https://downloads.mysql.com/archives/community/[rootlocalhost soft]# lsmysql-5.7.17-linux-glibc2.5-x86_64.tar.gz nginx-1.12.2 nginx-1.12.2.tar.gz[rootlocalhost soft]#1.详细描安装的过程1.1关闭防火墙systemctl stop firewalld.service #停止f…

.NET 类型(Types)的那些事

引言 您是.Net工程师&#xff1f;那 .NetFramework中的类型您知道有三大类吗&#xff1f;&#xff08;除了引用类型和值类型&#xff0c;还有&#xff1f;&#xff09; 引用类型一定在“堆”上&#xff0c;值类型一定在“栈”上&#xff1f; 那引用类型在内存中的布局细节您又知…

几种去除数组中重复元素的方法、数组去重

工作中遇到的一个问题&#xff0c;就是去除数组中重复的元素&#xff0c;记录一下几种有效的方法&#xff1a; 第一种思路&#xff1a;遍历要删除的数组arr, 把元素分别放入另一个数组tmp中&#xff0c;在判断该元素在arr中不存在才允许放入tmp中。 <!DOCTYPE html> <…

MongoDB学习使用

一、什么是MongoDB&#xff1f; MongoDB是一个高性能&#xff0c;开源&#xff0c;无模式的文档型数据库&#xff0c;是当前NoSql数据库中比较热门的一种。它在许多场景下可用于替代传统的关系型数据库或键/值存储方式&#xff0c; NoSql&#xff0c;全称是 Not Only Sql,指的是…

域账号更改密码之后代理需要重新配置

在使用域账号的时候&#xff0c;如果需要配置账户和密码&#xff0c;那么最好记录下来&#xff0c;否则将来找不到就很尴尬了。 我遇到的问题是&#xff0c;因为在另外一台电脑配置了域账号&#xff0c;用来联网&#xff0c;提供网络给visual studio 1.Firefox 这个代理的账号…