SQL
梦里Coding
bigData
展开
-
阿里两道面试sql题
这句话的字面意思理解,统计到用户id,订单id的维度,筛选出订单金额超过1000的用户,再having count 取有超过3的数据。有用户user_id,支付金额pay_amount字段,统计支付金额前90%的用户id。例如总的支付金额是10000,A用户支付金额4000,B用户支付金额3000,C用户支付金额2000,那么这三个总的支付金额就占了前90%,把这三个用户输出就可。这里要统计前90%,所以要分成10个桶,取到前9个桶。输出:买家id,订单数,总订单金额,总订单金额top 3的买家。原创 2023-05-17 17:29:54 · 614 阅读 · 0 评论 -
一道简单的sql练习题:统计客户数和订单数
select case when order_nums <= 5 then '0-5' when order_nums>=6 and order_nums<=10 then '6-10' when order_nums>=11 and order_nums<=20 then '11-20' else '20以上' end as sale_nums, count(1) as user_numsfrom( select user_id, .原创 2022-05-27 20:52:30 · 2116 阅读 · 1 评论 -
sql中的 where条件中AND、OR运算符的组合使用
我们有时候在限制条件的时候,where后的衔接条件用到AND 和OR一起出现的情况,这种情况往往会出现查询出来的结果和我们所要的结果不一致的场景。场景:输出昨天的数据和paid_sum(支付次数),check_sum(检测次数)(只要其中一个不为0)的数据:SELECT *FROM table.table_nameWHERE dt=sysdate(-1) AND (check_sum <> 0 OR paid_sum <> 0)如上面代码所示:需要将其进行用括号补原创 2022-02-28 16:28:31 · 2431 阅读 · 0 评论 -
拉链表取某一天的历史快照
拉链表在数仓的应用十分普遍。它会在原始的表字段里面添加两个新的字段:create_time和end_time这两个。这两个字段的日期代表的是这条数据的开始时间和结束时间,也就是数据的生命周期。我在开发的过程中会有这么一个问题,那就是我要取某一天的数据,有说法是create_time<=XXXX-XX-XX and end_time>=XXXX-XX-XX,也有说法说是:create_time<=XXXX-XX-XX and end_time>XXXX-XX-XX。区别在于end_t原创 2022-01-04 15:25:09 · 5582 阅读 · 4 评论 -
数据同步策略
一、业务数据库里面的数据每天需要同步到我们的数据仓库里面。根据数据量的大小,数据的变化情况,可以分成以下几类:1、全量表:存储完整的数据2、增量表:存储新增加的数据3、新增及变化表:存储新增加的数据和变化的数据4、特殊表:只需要存储一次的数据二、同步策略全量同步策略:每日全量,就是每天存储一份完整的数据,作为一个分区适用于表中数据量很小,每天可能会有数据新增或者数据修改的情形。增量同步策略:每日增量,就是每天存储一份增量数据,,作为一个分区适用于数据量大,每天都会向表中新增数据的场景(原创 2022-01-04 14:14:05 · 969 阅读 · 0 评论 -
HIVE-字段类型造成的数据倾斜
在创建表的时候,往往会关联ID字段,ID字段的类型会有STRING和INT,BIGINT等等。底层会自动去关联STRING跟INT STRING跟BIGINT,但是会出现数据倾斜的问题。 所以尽量在创建表的时候,保持表的类型一致。在join的时候会减少数据倾斜的产生。...原创 2021-12-21 18:02:32 · 919 阅读 · 0 评论 -
SQL-COALEASE函数
COALESCE()函数主流数据库系统都支持COALESCE()函数,这个函数主要用来进行空值处理,其参数格式如下:COALESCE(expression,value1,value2,value3,...,valuen)COALESCE()函数的第一个参数expression为待检测的表达式,而其后的参数个数不定。COALESCE()函数将会返回包括expression在内的所有参数中的第一个非空表达式。如果expression不为空值则返回expression;否则判断value1是否是空值;原创 2021-11-29 10:29:44 · 1033 阅读 · 0 评论 -
SQL-UNION ALL操作
SQL中的UNION ALL的注意事项:UNION 操作符用于合并两个或多个 SELECT 语句的结果集,这里需要注意的是:UNION 内部的 SELECT 语句必须拥有相同数量的列;列也必须拥有相似的数据类型(实际非必须);同时,每条 SELECT 语句中列的顺序必须相同。一、表的结构数据准备如下1.test_union_1CREATE TABLE `test_union_1` ( `one` varchar(255) DEFAULT NULL, `two` varchar(255)原创 2021-11-25 18:42:37 · 20945 阅读 · 1 评论 -
SQL高级功能-窗口函数及其经典题目
窗口函数1、窗口函数有什么用?2、什么是窗口函数?3、如何使用窗口函数1.专用窗口函数rank2、专用窗口函数rank, dense_rank, row_number的区别4、经典面试问题1、窗口函数有什么用?在日常工作中,经常会遇到需要在每组内排名,比如下面的业务需求:排名问题:每个部门按业绩来排名topN问题:找出每个部门排名前N的员工进行奖励面对这类需求,就需要使用sql的高级功能窗口函数了。2、什么是窗口函数?窗口函数,也叫OLAP函数(Online Anallytical Proce原创 2021-11-11 11:23:55 · 1455 阅读 · 0 评论 -
一道百度SQL题:求相互关注的用户数
今天面了百度,有一道这样的SQL题,题目是有一个user表,这个user表有两个字段,from_user,to_user:from_userto_userABBAACBC其中第一行数据代表的是A关注B,第二行数据代表B关注A,那么就表示A和B互相关注。求出所有互相关注的人数。最终的SQL如下:select u1.from_user, u1.to_userFROM weibo_user u1 join weibo_user u2 on u原创 2021-11-09 20:23:19 · 1938 阅读 · 0 评论 -
一道滴滴的SQL题:总登录次数和总登录人数,以及登录未支付的人数
有两张表:一张表是:login_table ,表的字段有user_id和login_time另一张表是:pay_table,表字段有user_id,pay_time,pay_num现在要求用一条sql 写出登录总次数 总登录人数 登录未支付的人数。注意事项:在我们对user_id进行group by之后,再求count(*),它所求的是分组内个数,例如最后的结果会是:user_id count(*)1001 21002 31003 5思路:登录总的次数,可以先group by原创 2021-11-02 18:37:21 · 463 阅读 · 0 评论 -
一道京东的SQL面试题:学生成绩表:id,科目,成绩,求总和
需求:有一张学生的成绩表,这张表有如下的字段:id,name,score,求查询结果是:id,name,score,以及该学生的所有科目的总和数据准备如下:首先创建表:create table stu_score(name varchar(20),subject varchar(20),score int(8))engine=innodb default charset=utf8;创建好表之后,插入数据:insert into stu_score values ('张三','语文',80原创 2021-11-04 11:14:31 · 2021 阅读 · 0 评论 -
SQL15 查找employees表emp_no与last_name的员工信息
描述有一个员工表employees简况如下:请你查找employees表所有emp_no为奇数,且last_name不为Mary的员工信息,并按照hire_date逆序排列,以上例子查询结果如下:注意点:逆序是从大到小,顺序是从小到大.这里面的逆序又是根据时间来进行排列的,时间的大小衡量就是根据数字本身的大小来衡量,1990>1986select * from employeeswhere emp_no%2==1 and last_name!='Mary'order by hire_d原创 2021-09-10 10:54:47 · 155 阅读 · 0 评论 -
SQL 语句limit用法
sql limit 2 , limit 2,3 , limit 2 offset 3 区别limit 2 限制结果为前2条记录limit 2, 3 从第2行开始,查询3条记录 起始值为第0行limit 2 offset 3 查询 2条记录,从第3行开始 起始值为第0行原创 2021-09-08 14:46:55 · 1170 阅读 · 0 评论