【数据分析面试】6.计算对话总数(SQL)

在这里插入图片描述

题目:计算对话总数

给定了名为 messenger_sends 的消息发送表格,找出总共有多少个唯一的对话。

注:在某些记录中,receiver_idsender_id 从初始消息中互换了。这些记录应视为同一个对话。

示例:

输入:

messenger_sends 表格

列名 类型
id 整数
receiver_id 整数
sender_id 整数

输出:

列名 类型
total_conv_threads 整数

答案

解题思路

要计算总共有多少个对话,首先需要考虑到对话是由一系列消息组成的,并且在某些情况下,消息的发送者和接收者可能会被交换。因此,我们需要将这些交换的情况考虑在内,将发送者和接收者的ID合并在一起,然后对这些合并后的ID进行计数。

也就是说,如果一条消息的receiver_id是A,sender_id是B,那么这条消息和receiver_id是B,sender_id是A的消息属于同一个对话。

我们可以创建一个新的列,将receiver_idsender_id按照由大到小的顺序组合起来。然后,我们可以对这个新列进行去重统计,得到的结果就是对话的总数量。

答案代码

SELECT
	--计算唯一对话总数
    COUNT(DISTINCT thread_id) AS total_conv_threads
FROM
    (
    --重新组合对话双方id
        SELECT
            CASE
                WHEN sender_id < receiver_id THEN CONCAT(sender_id, '_', receiver_id)
                ELSE CONCAT(receiver_id, '_', sender_id)
            END AS thread_id
        FROM
            messenger_sends
    ) AS threads;

CONCAT()用法总结

在MySQL中,CONCAT() 函数用于将两个或多个字符串连接成一个更长的字符串。它接受一个或多个字符串作为参数,并返回连接后的结果。例如:

SELECT CONCAT('Hello', ' ', 'World'); -- 输出:Hello World

SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM users; -- 将 first_name 和 last_name 字段连接成一个 full_name 字段

SELECT CONCAT('The user with ID ', user_id, ' has email: ', email) AS user_info FROM users; -- 使用字段值与常量字符串连接成一个信息字符串

MySQL中, CONCAT()函数主要用于的字符串连接,而Python中的字符串连接使用 + 操作符或 str.join() 方法,Pandas的pd.concat()函数则用于用于合并 Pandas 数据结构,如 DataFrame 或 Series 对象。

代码汇总

--题目:求对话数量
-- 创建messenger_sends表格
CREATE TABLE messenger_sends (
    id INT AUTO_INCREMENT PRIMARY KEY,
    receiver_id INT,
    sender_id INT
);

--插入数据
INSERT INTO messenger_sends(receiver_id, sender_id) VALUES
(1, 2),
(2, 1),
(1, 2),
(1, 2),
(2, 1),
(3, 1),
(3, 1),
(3, 2),
(4, 5),
(5, 4),
(4, 5),
(5, 1),
(5, 1),
(5, 1),
(6, 7),
(8, 7),
(7, 9),
(7, 10);

--答案:求对话数量
SELECT
    COUNT(DISTINCT thread_id) AS total_conv_threads
FROM
    (
        SELECT
            CASE
                WHEN sender_id < receiver_id THEN CONCAT(sender_id, '_', receiver_id)
                ELSE CONCAT(receiver_id, '_', sender_id)
            END AS thread_id
        FROM
            messenger_sends
    ) AS threads;

在这里插入图片描述

相关推荐

  1. 数据分析---SQL

    2024-04-07 22:00:03       42 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-07 22:00:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-07 22:00:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-07 22:00:03       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-07 22:00:03       20 阅读

热门阅读

  1. Android OkHttp

    2024-04-07 22:00:03       17 阅读
  2. ThreadLocal介绍

    2024-04-07 22:00:03       17 阅读
  3. 蓝桥杯算法题:最大比例

    2024-04-07 22:00:03       17 阅读
  4. React事件和原生事件的执行顺序

    2024-04-07 22:00:03       18 阅读
  5. 三十六计与代码编写的奇妙结合

    2024-04-07 22:00:03       15 阅读
  6. 免密登陆的办法以及设置登录界面的欢迎信息

    2024-04-07 22:00:03       19 阅读
  7. IPv4子网判断

    2024-04-07 22:00:03       21 阅读
  8. 题解:CF1941C(C. Rudolf and the Ugly String)

    2024-04-07 22:00:03       19 阅读
  9. 真正的力量:实力与人际关系的平衡艺术

    2024-04-07 22:00:03       18 阅读
  10. Go rand 随机数

    2024-04-07 22:00:03       14 阅读
  11. 19.删除链表的倒数第N个节点

    2024-04-07 22:00:03       12 阅读
  12. C++ [NOIP2006 普及组] 明明的随机数

    2024-04-07 22:00:03       17 阅读