首页 > 数据库 >快手大数据面试SQL-用户中两人一定认识的组合数

快手大数据面试SQL-用户中两人一定认识的组合数

时间:2024-06-16 16:58:23浏览次数:25  
标签:00 01 快手 08 SQL 面试 user 2023 id

本文首发在数据仓库技术,网站种整理了几十篇各大公司大数据开发岗位、数据仓库、数据分析相关岗位实际面试SQL题目,并给出了对应的参考答案。 快手大数据面试SQL-用户中两人一定认识的组合数.

一、题目

有某城市网吧上网记录表,包含字段:网吧id,访客id(身份证号),上线时间,下线时间。

  • 规则1:如果两个用户在同一个网吧上线时间或者下线时间间隔在10分钟以内,则两个用户可能认识;
  • 规则2:如果两个用户在三家以上的网吧出现过【规则1】可能认识的情况,则两人一定认识;

请计算该市中两人一定认识的组合数

+---------+----------+----------------------+----------------------+
| bar_id  | user_id  |      login_time      |     logoff_time      |
+---------+----------+----------------------+----------------------+
| 1       | 001      | 2023-08-01 09:00:00  | 2023-08-01 10:00:00  |
| 1       | 003      | 2023-08-01 09:04:00  | 2023-08-01 11:00:00  |
| 2       | 004      | 2023-08-01 10:00:00  | 2023-08-01 12:02:00  |
| 1       | 006      | 2023-08-01 10:00:00  | 2023-08-01 12:00:00  |
| 2       | 005      | 2023-08-01 10:10:00  | 2023-08-01 11:00:00  |
| 2       | 001      | 2023-08-01 11:01:00  | 2023-08-01 12:00:00  |
| 2       | 002      | 2023-08-01 11:03:00  | 2023-08-01 14:00:00  |
| 3       | 002      | 2023-08-02 15:00:00  | 2023-08-02 17:06:00  |
| 3       | 001      | 2023-08-02 16:01:00  | 2023-08-02 17:07:00  |
| 3       | 004      | 2023-08-02 16:02:00  | 2023-08-02 18:00:00  |
| 3       | 003      | 2023-08-02 20:00:00  | 2023-08-02 22:00:00  |
| 4       | 001      | 2023-08-03 17:00:00  | 2023-08-03 19:00:00  |
| 4       | 002      | 2023-08-03 18:00:00  | 2023-08-03 21:00:00  |
| 4       | 003      | 2023-08-03 18:05:00  | 2023-08-03 22:00:00  |
| 4       | 004      | 2023-08-03 19:00:00  | 2023-08-03 18:58:00  |
+---------+----------+----------------------+----------------------+

二、分析

  1. 首先计算可能认识的人,由于所有可能认识的条件必须发生在同一个网吧内,以bar_id进行自关联,然后id要求t1>t2来保证同一个用户和其他的用户只进行一次关联,限定上线时间或者下线时间在10分钟内;
  2. 计算出可能认识的用户组中,出现的网吧个数;
  3. 计算网吧个数>=3的组合数;
维度评分
题目难度⭐️⭐️⭐️
题目清晰度⭐️⭐️⭐️⭐️⭐️
业务常见度⭐️⭐️⭐️

三、SQL

1.可能认识的记录

查询SQL

select t1.bar_id,
       t1.user_id,
       t1.login_time,
       t1.logoff_time,
       t2.bar_id,
       t2.user_id,
       t2.login_time,
       t2.logoff_time
from (select bar_id, user_id, login_time, logoff_time
      from t_netbar) t1
         join
     (select bar_id, user_id, login_time, logoff_time
      from t_netbar) t2
     on t1.bar_id = t2.bar_id
where t1.user_id < t2.user_id --限定t1的user_id <t2的user_id,防止重复关联和自关联
  and (
    abs(unix_timestamp(t1.login_time, 'yyyy-MM-dd HH:mm:ss') - unix_timestamp(t2.login_time, 'yyyy-MM-dd HH:mm:ss')) <
    600-- 上线时间在10min内
        or
    abs(unix_timestamp(t1.logoff_time, 'yyyy-MM-dd HH:mm:ss') - unix_timestamp(t2.logoff_time, 'yyyy-MM-dd HH:mm:ss')) <
    600 -- 下线时间在10min内
    )

查询结果

+------------+-------------+----------------------+----------------------+------------+-------------+----------------------+----------------------+
| t1.bar_id  | t1.user_id  |    t1.login_time     |    t1.logoff_time    | t2.bar_id  | t2.user_id  |    t2.login_time     |    t2.logoff_time    |
+------------+-------------+----------------------+----------------------+------------+-------------+----------------------+----------------------+
| 2          | 001         | 2023-08-01 11:01:00  | 2023-08-01 12:00:00  | 2          | 002         | 2023-08-01 11:03:00  | 2023-08-01 14:00:00  |
| 3          | 001         | 2023-08-02 16:01:00  | 2023-08-02 17:07:00  | 3          | 002         | 2023-08-02 15:00:00  | 2023-08-02 17:06:00  |
| 1          | 001         | 2023-08-01 09:00:00  | 2023-08-01 10:00:00  | 1          | 003         | 2023-08-01 09:04:00  | 2023-08-01 11:00:00  |
| 4          | 002         | 2023-08-03 18:00:00  | 2023-08-03 21:00:00  | 4          | 003         | 2023-08-03 18:05:00  | 2023-08-03 22:00:00  |
| 2          | 001         | 2023-08-01 11:01:00  | 2023-08-01 12:00:00  | 2          | 004         | 2023-08-01 10:00:00  | 2023-08-01 12:02:00  |
| 3          | 001         | 2023-08-02 16:01:00  | 2023-08-02 17:07:00  | 3          | 004         | 2023-08-02 16:02:00  | 2023-08-02 18:00:00  |
| 4          | 001         | 2023-08-03 17:00:00  | 2023-08-03 19:00:00  | 4          | 004         | 2023-08-03 19:00:00  | 2023-08-03 18:58:00  |
+------------+-------------+----------------------+----------------------+------------+-------------+----------------------+----------------------+

2.按照t1的user_id、t2的user_id 进行分组,统计网吧ID个数

执行SQL

select user_id1,
       user_id2,
       count(distinct bar_id) as bar_num
from (select t1.bar_id,
             t1.user_id as user_id1,
             t2.user_id as user_id2
      from (select bar_id, user_id, login_time, logoff_time
            from t_netbar) t1
               join
           (select bar_id, user_id, login_time, logoff_time
            from t_netbar) t2
           on t1.bar_id = t2.bar_id
      where t1.user_id < t2.user_id --限定t1的user_id <t2的user_id,防止重复关联和自关联
        and (
          abs(unix_timestamp(t1.login_time, 'yyyy-MM-dd HH:mm:ss') -
              unix_timestamp(t2.login_time, 'yyyy-MM-dd HH:mm:ss')) < 600-- 上线时间在10min内
              or
          abs(unix_timestamp(t1.logoff_time, 'yyyy-MM-dd HH:mm:ss') -
              unix_timestamp(t2.logoff_time, 'yyyy-MM-dd HH:mm:ss')) < 600 -- 下线时间在10min内
          )) t
group by user_id1, user_id2

查询结果

+-----------+-----------+----------+
| user_id1  | user_id2  | bar_num  |
+-----------+-----------+----------+
| 001       | 002       | 2        |
| 001       | 003       | 1        |
| 001       | 004       | 3        |
| 002       | 003       | 1        |
+-----------+-----------+----------+

3.统计最终结果

执行SQL

select count(1) as group_nums
from (select user_id1,
             user_id2,
             count(distinct bar_id) as bar_num
      from (select t1.bar_id,
                   t1.user_id as user_id1,
                   t2.user_id as user_id2
            from (select bar_id, user_id, login_time, logoff_time
                  from t_netbar) t1
                     join
                 (select bar_id, user_id, login_time, logoff_time
                  from t_netbar) t2
                 on t1.bar_id = t2.bar_id
            where t1.user_id < t2.user_id --限定t1的user_id <t2的user_id,防止重复关联和自关联
              and (
                abs(unix_timestamp(t1.login_time, 'yyyy-MM-dd HH:mm:ss') -
                    unix_timestamp(t2.login_time, 'yyyy-MM-dd HH:mm:ss')) < 600-- 上线时间在10min内
                    or
                abs(unix_timestamp(t1.logoff_time, 'yyyy-MM-dd HH:mm:ss') -
                    unix_timestamp(t2.logoff_time, 'yyyy-MM-dd HH:mm:ss')) < 600 -- 下线时间在10min内
                )) t
      group by user_id1, user_id2) tt
where bar_num >= 3

查询结果

+-------------+
| group_nums  |
+-------------+
| 1           |
+-------------+

四、建表语句和数据插入

--建表语句
CREATE TABLE t_netbar (
bar_id bigint COMMENT '网吧ID',
user_id string COMMENT '用户ID',
login_time string COMMENT '上线时间',
logoff_time string COMMENT '下线时间'
) COMMENT '网吧上下线记录表'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' 
;
-- 插入数据
insert into t_netbar(bar_id,user_id,login_time,logoff_time)
values
(1,'001','2023-08-01 09:00:00','2023-08-01 10:00:00'),
(2,'001','2023-08-01 11:01:00','2023-08-01 12:00:00'),
(2,'002','2023-08-01 11:03:00','2023-08-01 14:00:00'),
(3,'001','2023-08-02 16:01:00','2023-08-02 17:07:00'),
(3,'002','2023-08-02 15:00:00','2023-08-02 17:06:00'),
(4,'001','2023-08-03 17:00:00','2023-08-03 19:00:00'),
(4,'002','2023-08-03 18:00:00','2023-08-03 21:00:00'),
(1,'003','2023-08-01 09:04:00','2023-08-01 11:00:00'),
(3,'003','2023-08-02 20:00:00','2023-08-02 22:00:00'),
(4,'003','2023-08-03 18:05:00','2023-08-03 22:00:00'),
(2,'004','2023-08-01 10:00:00','2023-08-01 12:02:00'),
(3,'004','2023-08-02 16:02:00','2023-08-02 18:00:00'),
(4,'004','2023-08-03 19:00:00','2023-08-03 18:58:00'),
(2,'005','2023-08-01 10:10:00','2023-08-01 11:00:00'),
(1,'006','2023-08-01 10:00:00','2023-08-01 12:00:00')

标签:00,01,快手,08,SQL,面试,user,2023,id
From: https://blog.csdn.net/thenowaiting/article/details/139722474

相关文章

  • 在Linux中,新安装mysql后怎样提升mysql的安全级别?
    在Linux环境中,新安装MySQL后提高其安全级别的步骤通常包括以下几个关键方面:更改默认root密码:安装MySQL后,第一时间更改默认的root用户密码。可以使用以下命令登录MySQL并更改密码:mysql-urootALTERUSER'root'@'localhost'IDENTIFIEDBY'your_strong_password';确保yo......
  • Linux下部署MySQL5.7.35
    1.MySQL下载(1)登录到以下网站 https://downloads.mysql.com/archives/community/(2)选择需要的版本,以及操作系统,这里是RedHatEnterpriseLinux/OracleLinux5.7.35版本。(3)Mysql安装需要5个rpm包,如下图    mysql-community-common-5.7.35-1.el7.x86_64.rpm......
  • Java 面试题:Java 中的 int 和 Integer 有什么区别?
    在Java编程语言中,int和Integer都是用于表示整数的数据类型,但它们在使用和功能上有着明显的区别。int是一种基本数据类型(primitivetype),而Integer则是一个对象类型(wrapperclass)。理解这两者的区别对于编写高效、健壮和易维护的Java代码至关重要。文章目录1、面试问题......
  • 嵌入式面试题精选100道及参考答案(4万字长文)
    目录解释C语言中的static关键字的作用const关键字在C语言中如何使用解释volatile关键字的重要性什么是指针?并举例说明其用法解释结构体(struct)在C语言中的使用枚举(enum)类型在C语言中的作用解释C语言中的联合(union)什么是函数原型?为什么它们很重要?解释C语言中的递归函数......
  • MySQL 乐观锁
    MySQL乐观锁乐观锁认为当前的情况是最好的情况,即每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据droptableifexistssupply_address;--创建表CREATETABLEifnotexists`supply_address`(`id`int......
  • Python在SQLite中的应用:从入门到进阶
    Python在SQLite中的应用:从入门到进阶Python作为一门高效、灵活的编程语言,广泛应用于各种数据处理和分析任务。而SQLite是一种轻量级的数据库管理系统,特别适合于嵌入式应用和小型项目。在本篇博文中,我们将深入探讨Python在SQLite中的应用,帮助读者从零开始,逐步掌握这项技能。......
  • 查找拥有有效邮箱的用户(sql练习)
    表: Users+---------------+---------+|ColumnName|Type|+---------------+---------+|user_id|int||name|varchar||mail|varchar|+---------------+---------+user_id是该表的主键(具有唯一值的列)。该表包含了网......
  • Navicat和SQLynx产品功能比较一(整体比较)
    Navicat和SQLynx都是数据库管理工具,在过去的二十年中,国内用户主要是使用Navicat偏多,一般是个人简单开发需要,数据量一般不大,开发相对简单。SQLynx是最近几年的数据库管理工具,Web开发,桌面版是Electron封装,主要针对企业级客户设计,针对大型企业数据规模比较大,个人用户也可以使用。......
  • 《软件性能测试分析与调优实践之路》第二版-手稿节选-Mysql数据库性能定位与分析
    在做MySQL数据的性能定位前,需要先知道MySQL查询时数据库内部的执行过程。只有弄清SQL的执行过程,才能对执行过程中的每一步的性能做定位分析。如图6-2-1所示。图6-2-1从图中可以看到,当查询出数据以后,会将数据先返回给执行器,此时执行器先将结果写到查询缓存里面,这样在下次查询相......
  • 1832javaERP管理系统之车间计划管理Myeclipse开发mysql数据库servlet结构java编程计算
    一、源码特点 javaerp管理系统之车间计划管理是一套完善的web设计系统,对理解JSPjava编程开发语言有帮助采用了serlvet设计,系统具有完整的源代码和数据库,系统采用web模式,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql,使用java语言开发。......