本文首发自公众号“数仓技术”,欢迎关注查看更多文章

一、题目

有两个表,朋友关系表user_friend,用户步数表user_steps。朋友关系表包含两个字段,用户id,用户好友的id;用户步数表包含两个字段,用户id,用户的步数

查询: 占据多少个好友的封面(在好友的列表中排行第一,且必须超过好友的步数)

user_friend 数据

+----------+------------+
| user_id  | friend_id  |
+----------+------------+
| 1        | 2          |
| 1        | 3          |
| 2        | 1          |
| 2        | 3          |
| 2        | 4          |
| 2        | 5          |
| 3        | 1          |
| 3        | 4          |
| 3        | 5          |
| 4        | 2          |
| 4        | 3          |
| 4        | 5          |
| 5        | 2          |
| 5        | 3          |
| 5        | 4          |
+----------+------------+

user_friend数据

+---------------------+-------------------+
| user_steps.user_id  | user_steps.steps  |
+---------------------+-------------------+
| 1                   | 100               |
| 2                   | 95                |
| 3                   | 90                |
| 4                   | 80                |
| 5                   | 10                |
+---------------------+-------------------+

二、题目分析

1.计算步骤

1.要求在好友中排名第一,由于好友关系是相互的,所以,查出user_id的步数,然后按照friend_id分组,得出好友的,朋友步数列表。考察的row_number()函数(略去步数相同情况)

2.取排名第一的数据,然后就知道在好友的好友列表中排名的第一的人了;

3.将结果关联出好友的步数;

4.然后把第一的数据和朋友的步数进行比较得出是否是否占据了朋友封面;

5.需要计算所有用户,使用步数表拿到全量用户进行关联计算;

2.难度分析

维度 评分
题目难度 ⭐️⭐️⭐️⭐️⭐️
题目清晰度 ⭐️⭐️⭐️⭐️⭐️
业务常见度 ⭐️⭐️⭐️⭐️⭐️

三、SQL

1.给好友的好友步数

--好友的好友步数
select t1.user_id,t1.friend_id,t2.steps as user_steps
from user_friend t1
join user_steps t2
on t1.friend_id = t2.user_id

结果如下:注意第三列,是user_id对应的步数,即好友的好友步数

2.好友的好友步数排名,并取出排名第一的人、步数

--好友的好友步数排名
select
user_id,
friend_id,
user_steps
from(
select t1.user_id,t1.friend_id,t2.steps as user_steps,
row_number()over(partition by t1.friend_id order by t2.steps desc) as row_num
from user_friend t1
join user_steps t2
on t1.user_id = t2.user_id) t
where row_num = 1

结果如下:

3.关联好友步数;

with t_no1 as --好友的好友步数排名
(
select
user_id,
friend_id,
user_steps
from(
select t1.user_id,t1.friend_id,t2.steps as user_steps,
row_number()over(partition by t1.friend_id order by t2.steps desc) as row_num
from user_friend t1
join user_steps t2
on t1.user_id = t2.user_id) t
where row_num = 1)
select
t_no1.user_id,
t_no1.friend_id,
t_no1.user_steps,
t_steps.steps as friend_steps
from t_no1
join user_steps t_steps
on t_no1.friend_id = t_steps.user_id

查询结果如下

4.增加判断条件,得出是否占据好友封面

with t_no1 as
(--好友的好友步数排名
select
user_id,
friend_id,
user_steps
from(
select t1.user_id,t1.friend_id,t2.steps as user_steps,
row_number()over(partition by t1.friend_id order by t2.steps desc) as row_num
from user_friend t1
join user_steps t2
on t1.user_id = t2.user_id) t
where row_num = 1)
select
t_no1.user_id as user_id,
t_no1.friend_id as friend_id,
t_no1.user_steps as user_steps,
t_steps.steps as friend_steps,
if(t_no1.user_steps>t_steps.steps,1,0) as flag
from t_no1
join user_steps t_steps
on t_no1.friend_id = t_steps.user_id

查询结果如下:

5.查询结果

with t_no1 as
(--好友的好友步数排名
select
user_id,
friend_id,
user_steps
from(
select t1.user_id,t1.friend_id,t2.steps as user_steps,
row_number()over(partition by t1.friend_id order by t2.steps desc) as row_num
from user_friend t1
join user_steps t2
on t1.user_id = t2.user_id) t
where row_num = 1),
--查询标签中间结果
t_flag as(
select
t_no1.user_id as user_id,
t_no1.friend_id as friend_id,
t_no1.user_steps as user_steps,
t_steps.steps as friend_steps,
if(t_no1.user_steps>t_steps.steps,1,0) as flag
from t_no1
join user_steps t_steps
on t_no1.friend_id = t_steps.user_id)
select
user_steps.user_id,
nvl(sum(flag),0) as num
from user_steps
left join
t_flag
on user_steps.user_id = t_flag.user_id
group by user_steps.user_id

查询结果

四、建表语句和数据插入

-- 创建好友关系表
CREATE TABLE user_friend (user_id INT,friend_id INT
) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\\t';-- 插入数据
INSERT INTO user_friend VALUES (1, 2), (1, 3), (2, 1), (2, 3), (2, 4), (2, 5),(3, 1), (3, 4), (3, 5),(4, 2), (4, 3), (4, 5),(5, 2), (5, 3), (5, 4);CREATE TABLE user_steps(user_id INT,steps INT
) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\\t';INSERT INTO user_steps VALUES (1,100),(2,95),(3,90),(4,80),(5,10);

HiveSql-微信运动占据多少个好友的封面相关推荐

  1. python+appium爬取微信运动数据,并分析好友的日常步数情况

    python+appium爬取微信运动数据,并分析好友的日常步数情况 声明:仅供技术交流,请勿用于非法用途,如有其它非法用途造成损失,和本博客无关 目录 python+appium爬取微信运动数据,并 ...

  2. 手机用计算机微信运动记步吗,微信运动怎么用?微信运动计步功能使用方法介绍...

    微信手机版2017v6.5.4 官网最新版 类型:社交聊天大小:38.7M语言:中文 评分:9.3 标签: 立即下载 微信运动计步功能推出已经有较长的一段时间了,但是许多的手机微信用户不知道微信 ...

  3. iOS 免越狱修改微信运动步数

    说明: 相信喜欢逆向工程的小伙伴已经对微信自动抢红包插件有所耳闻了,或者可以说,已经被广泛的传播了,但笔者发现,其实只有两篇是原创的,其余均为疯狂转载.看了下网上对于微信的"喜爱" ...

  4. iOS 教你如何修改微信运动步数

    作者:糯米粉 来自:http://www.jianshu.com/p/b8b7fd5447c2 占领别人封面效果 说明: 相信喜欢逆向工程的小伙伴已经对微信自动抢红包插件有所耳闻了,或者可以说,已经被 ...

  5. 微信运动刷步实践教程

    说明: 相信喜欢逆向工程的小伙伴已经对微信自动抢红包插件有所耳闻了,或者可以说,已经被广泛的传播了,但笔者发现,其实只有两篇是原创的,其余均为疯狂转载.看了下网上对于微信的"喜爱" ...

  6. 抱歉,Xposed真的可以为所欲为——3.微信运动占领封面出售广告位

    抱歉,Xposed真的可以为所欲为--3.微信运动占领封面出售广告位 标签: 2018 一句话概括本文 简单的二十行代码,利用Xposed Hook掉计步传感器,以此达到刷步数的目的. 引言 现在的年 ...

  7. 抱歉,Xposed真的可以为所欲为——3.微信运动占领封面出售广告位(转载)

    一句话概括本文 简单的二十行代码,利用Xposed Hook掉计步传感器,以此达到刷步数的目的. 引言 现在的年轻都喜欢用各种各样的计步APP来记录每天的步数,微信自带的 微信运动因为用户群体基数大, ...

  8. python 广告牌_抱歉,Xposed真的可以为所欲为——3.微信运动占领封面出售广告位...

    一句话概括本文 简单的二十行代码,利用Xposed Hook掉计步传感器,以此达到刷步数的目的. 引言 现在的年轻都喜欢用各种各样的计步APP来记录每天的步数,微信自带的 微信运动因为用户群体基数大, ...

  9. 手把手教你当微信运动第一名 – 利用Android Hook进行微信运动作弊

    蒸米 · 2015/09/06 10:29 0x00 序 随着带协处理器和买手环的人越来越多,微信运动一下子火了,只要你在微信关注微信运动,手机就能自动记录你每天行走的步数,还可以跟朋友圈里的好友PK ...

最新文章

  1. windows 安装与使用redis
  2. matlab 矩阵序列R6(n),MATLAB___09年试题加答案
  3. nginx location 在配置中的优先级
  4. matlab在统计学中的简单应用
  5. 利用Math.random做背景图像随机切换【前端开发技能必备系列】
  6. linux-防火墙有关知识积累
  7. 对话Linus:Linux 25岁啦
  8. python绘制蟒蛇绕圈圈_Python学习之循环--绕圈圈(蛇形盘)
  9. 使用pickle模块序列化数据,优化代码
  10. 专栏丨MySQL 高频面试题解析
  11. php require 输出乱码,php输出乱码
  12. vue项目中遇到的问题总结
  13. 北仑泰河中学2021高考成绩查询,【大柴中崛起】北仑四所中学高考揭晓。
  14. freemarker【FTL】常见语法大全
  15. python定位元素方法_Python+webdriver定位元素的几种方法
  16. Mysql 远程登陆配置
  17. 亚太地区数学建模优秀论文_2020APMCM 亚太地区大学生数学建模竞赛
  18. 如​何​计​算​当​地​的​中​央​子​午​线​经​度
  19. 佳能MP145 /140故障代码大全
  20. xp系统能安装32位的python吗-32位XP系统 Python3.4.4安装scrapy1.6.0

热门文章

  1. shader编程-二维空间中使用矩阵实现物体的旋转、缩放、平移变换(WebGL-Shader开发基础03)
  2. 计算器(calculator ;counter)一般是指“电子计算器”
  3. 我的android应用(提供源码)
  4. 浅谈HIVE数据存储格式使用STORED AS ORC 格式
  5. Git 之 revert
  6. 跳槽:三年五年一个坎
  7. 微信小程序登录获取Token以及微信支付
  8. CIE 2017 color fidelity index(CFI) 色保真度指数 计算软件
  9. Thinkphp 微信公众号开发3-微信登录源码
  10. MFC中获取指定打印机的打印队列的方法