HiveSQL——用户中两人一定认识的组合数

2024-02-09 18:12

本文主要是介绍HiveSQL——用户中两人一定认识的组合数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

注:参考文章:

SQL之用户中两人一定认识的组合数--HQL面试题36【快手数仓面试题】_sql面试题-快手-CSDN博客文章浏览阅读1.2k次,点赞3次,收藏12次。目录0 需求分析1 数据准备2 数据分析3 小结0 需求分析设表名:table0现有城市网吧访问数据,字段:网吧id,访客id(身份证号),上线时间,下线时间规则1、如果有两个用户在一家网吧的前后上下线时间在10分钟以内,则两人可能认识规则2、如果这两个用户在三家以上网..._sql面试题-快手https://blog.csdn.net/godlovedaniel/article/details/119155757

0 问题描述

     现有一张表table21, 里面装载城市网吧访问数据,字段:网吧id, 访客id(身份证号),上线时间、下线时间

     规则1:如果有两个用户在一家网吧的前后上线时间在10分钟内,则两人可能认识;

     规则2:如果这两个用户在三家以上网吧出现【规则1】的情况,则两人一定认识

  需求:该城市上网用户中两人一定认识的组合数

1 数据准备

create table table21(wid string,uid string,ontime string,offtime string
)
row format delimited fields terminated by '\t';insert overwrite table table21 values(1,110001,'2020-01-01 11:10:00','2020-01-01 11:15:00')
,(1,110001,'2020-01-01 11:18:00','2020-01-01 11:23:00')
,(1,110002,'2020-01-01 12:10:00','2020-01-01 13:15:00')
,(1,110001,'2020-01-01 12:11:00','2020-01-01 13:10:00')
,(1,110003,'2020-01-01 12:15:00','2020-01-01 13:15:00')
,(1,110004,'2020-01-01 12:16:00','2020-01-01 13:18:00'),(2,110001,'2020-01-02 12:10:00','2020-01-02 12:30:00')
,(2,110001,'2020-01-02 12:50:00','2020-01-02 13:05:00')
,(2,110002,'2020-01-02 12:52:00','2020-01-02 12:55:00')
,(2,110003,'2020-01-02 12:58:00','2020-01-02 13:20:00')
,(2,110004,'2020-01-02 13:00:00','2020-01-02 13:10:00'),(3,110001,'2020-01-03 12:10:00','2020-01-03 12:30:00')
,(3,110003,'2020-01-03 12:55:00','2020-01-03 13:02:00')
,(3,110001,'2020-01-03 12:50:00','2020-01-03 12:55:00')
,(3,110002,'2020-01-03 13:00:00','2020-01-03 13:01:00')
,(3,110004,'2020-01-03 12:58:00','2020-01-03 13:03:00')
,(3,110002,'2020-01-03 13:20:00','2020-01-03 13:25:00');

2  数据分析

     根据规则1和规则2,求城市上网用户中两人一定认识的组合数,就是指两两相识的组合数。对于这种两两组合数一般用自关联,通过自关联将尽可能的情况表示出来,然后按照条件筛选数据

    step1:表自关联计算,得到所有相遇的情况:(笛卡尔积)

select *
from table21 as t0
join table21 as t1;

    step2:根据规则1,得出可能的结果:

 selectt0.wid as t0_wid,t0.uid as t0_uid,t1.wid as t1_wid,t1.uid as t1_uidfrom table21 as t0join table21 as t1where t0.wid = t1.widand (abs(unix_timestamp(t0.ontime, 'yyyy-MM-dd HH:mm:ss')- unix_timestamp(t1.ontime, 'yyyy-MM-dd HH:mm:ss')) < 600 orabs(unix_timestamp(t0.offtime, 'yyyy-MM-dd HH:mm:ss')- unix_timestamp(t1.offtime, 'yyyy-MM-dd HH:mm:ss')) < 600)and t0.uid > t1.uid

上述代码用到的函数:

unix_timestamp(日期转时间戳函数)
语法:unix_timestamp(string date)  、unix_timestamp(string date,string pattern)
返回值:bigint
说明:将格式为"yyyy-MM-dd HH:mm:ss"的日期 转换成 unix的时间戳。如果转换失败,则返回值为0;
举例:select unix_timestamp('20240201 20:17:11','yyyyMMdd HH:mm:ss')  --> 1706825843

 abs(unix_timestamp(t0.ontime, 'yyyy-MM-dd HH:mm:ss')  - unix_timestamp(t1.ontime, 'yyyy-MM-dd HH:mm:ss')) < 600  代表的意思是:两个用户在一家网吧的前后上线时间在10分钟内(10分钟也就是600秒)

   ps: 需要将同一网吧中可能两两相识的人筛选出来,所以【用户A、用户B】 与【用户B、用户A】 实际上是一样的,只需要选出 t0.uid > t1.uid 即可(去重取一)

step3:根据step2,可以将同一网吧中可能两两相识的人筛选出来,将互相认识的人组合成一个key,通过该key来判断该两人是否满足规则2。具体sql如下:

 selectt0_wid,-- 将可能互相认识的人的uid拼接起来,组成key值(uuid)concat_ws('~', t0_uid, t1_uid) as uuid
from (selectt0.wid as t0_wid,t0.uid as t0_uid,t1.wid as t1_wid,t1.uid as t1_uidfrom table21 as t0join table21 as t1where t0.wid = t1.widand (abs(unix_timestamp(t0.ontime, 'yyyy-MM-dd HH:mm:ss')- unix_timestamp(t1.ontime, 'yyyy-MM-dd HH:mm:ss')) < 600 orabs(unix_timestamp(t0.offtime, 'yyyy-MM-dd HH:mm:ss')- unix_timestamp(t1.offtime, 'yyyy-MM-dd HH:mm:ss')) < 600)and t0.uid > t1.uid) t2

step4:对【两人一定认识】记录进行打标签,记为 1

selectuuid,-- 对【两人一定认识】记录进行打标签,记为 1if(count(t0_wid) >=3,1,0) as flagfrom
(selectt0_wid,-- 将可能互相认识的人的uid拼接起来,组成key值(uuid)concat_ws('~', t0_uid, t1_uid) as uuid
from (selectt0.wid as t0_wid,t0.uid as t0_uid,t1.wid as t1_wid,t1.uid as t1_uidfrom table21 as t0join table21 as t1where t0.wid = t1.widand (abs(unix_timestamp(t0.ontime, 'yyyy-MM-dd HH:mm:ss')- unix_timestamp(t1.ontime, 'yyyy-MM-dd HH:mm:ss')) < 600 orabs(unix_timestamp(t0.offtime, 'yyyy-MM-dd HH:mm:ss')- unix_timestamp(t1.offtime, 'yyyy-MM-dd HH:mm:ss')) < 600)and t0.uid > t1.uid) t2
)t3
group by  uuid;

step4:计算满足规则1和规则2的记录总数,得出结果为6条

selectcount(1) as cnt
from (selectuuid,-- 对【两人一定认识】记录进行打标签,记为 1if(count(t0_wid) >= 3, 1, 0) as flagfrom (selectt0_wid,-- 将可能互相认识的人的uid拼接起来,组成key值(uuid)concat_ws('~', t0_uid, t1_uid) as uuidfrom (selectt0.wid as t0_wid,t0.uid as t0_uid,t1.wid as t1_wid,t1.uid as t1_uidfrom table21 as t0join table21 as t1where t0.wid = t1.widand (abs(unix_timestamp(t0.ontime, 'yyyy-MM-dd HH:mm:ss')- unix_timestamp(t1.ontime, 'yyyy-MM-dd HH:mm:ss')) < 600 orabs(unix_timestamp(t0.offtime, 'yyyy-MM-dd HH:mm:ss')- unix_timestamp(t1.offtime, 'yyyy-MM-dd HH:mm:ss')) < 600)and t0.uid > t1.uid) t2) t3group by uuid) t4;

3 小结  

   本案例题型属于:“共同xx”,例如:共同好友、互相认识、共同使用等。遇到这类关键字的时候,往往可以采用自关联的方式解决。(笛卡尔积:“一对多”或者“ 多对一”),一般的解题步骤就是:通过自关联将所有的组合求解出来,然后将符合条件的数据进行过滤即可。

这篇关于HiveSQL——用户中两人一定认识的组合数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/694946

相关文章

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

每天认识几个maven依赖(ActiveMQ+activemq-jaxb+activesoap+activespace+adarwin)

八、ActiveMQ 1、是什么? ActiveMQ 是一个开源的消息中间件(Message Broker),由 Apache 软件基金会开发和维护。它实现了 Java 消息服务(Java Message Service, JMS)规范,并支持多种消息传递协议,包括 AMQP、MQTT 和 OpenWire 等。 2、有什么用? 可靠性:ActiveMQ 提供了消息持久性和事务支持,确保消

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

hdu4869(逆元+求组合数)

//输入n,m,n表示翻牌的次数,m表示牌的数目,求经过n次操作后共有几种状态#include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdlib.h>#includ

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟

Go组合

摘要 golang并非完全面向对象的程序语言,为了实现面向对象的继承这一神奇的功能,golang允许struct间使用匿名引入的方式实现对象属性方法的组合 组合使用注意项 使用匿名引入的方式来组合其他struct 默认优先调用外层方法 可以指定匿名struct以调用内层方法 代码 package mainimport ("fmt")type People struct{}type Pe

vue2实践:el-table实现由用户自己控制行数的动态表格

需求 项目中需要提供一个动态表单,如图: 当我点击添加时,便添加一行;点击右边的删除时,便删除这一行。 至少要有一行数据,但是没有上限。 思路 这种每一行的数据固定,但是不定行数的,很容易想到使用el-table来实现,它可以循环读取:data所绑定的数组,来生成行数据,不同的是: 1、table里面的每一个cell,需要放置一个input来支持用户编辑。 2、最后一列放置两个b

跟我一起玩《linux内核设计的艺术》第1章(四)——from setup.s to head.s,这回一定让main滚出来!(已解封)

看到书上1.3的大标题,以为马上就要见着main了,其实啊,还早着呢,光看setup.s和head.s的代码量就知道,跟bootsect.s没有可比性,真多……这确实需要包括我在内的大家多一些耐心,相信见着main后,大家的信心和干劲会上一个台阶,加油! 既然上篇已经玩转gdb,接下来的讲解肯定是边调试边分析书上的内容,纯理论讲解其实我并不在行。 setup.s: 目标:争取把setup.

SpringMVC-1.认识及配置

SpringMVC是一个基于请求驱动的Web框架,和structs一样是目前最优秀的基于MVC框架,现在的项目一般都使用SpringMVC代替Structs。 MVC模式中,Model是应用程序中用于处理应用程序数据逻辑的部分,通常模型对象在数据库中存取数据。View是应用程序中处理数据显示的部分,通常视图是依据模型数据创建。Controller是应用程序中处理用户交互的部分。通常控制器负责从视

【H2O2|全栈】关于HTML(1)认识HTML

HTML相关知识 目录 前言 准备工作 WEB前端是什么? HTML是什么? 如何运行HTML文件? 标签 概念 分类 双标签和单标签 行内标签和块标签 HTML文档结构 预告和回顾 UI设计相关 Markdown | Md文档相关  项目合作管理相关  后话 前言 本系列的博客将分享前端HTML的相关知识点。 本篇作为本系列的第一期博客,主要讲解H