力扣之1364.顾客的可信联系人数量

news2024/11/23 13:32:37
  • 题目:

  • sql建表语句:

  • Create table If Not Exists Customers (customer_id int, customer_name varchar(20), email varchar(30));
    Create table If Not Exists Contacts (user_id int, contact_name varchar(20), contact_email varchar(30));
    Create table If Not Exists Invoices (invoice_id int, price int, user_id int);
    Truncate table Customers;
    insert into Customers (customer_id, customer_name, email) values ('1', 'Alice', 'alice@leetcode.com');
    insert into Customers (customer_id, customer_name, email) values ('2', 'Bob', 'bob@leetcode.com');
    insert into Customers (customer_id, customer_name, email) values ('13', 'John', 'john@leetcode.com');
    insert into Customers (customer_id, customer_name, email) values ('6', 'Alex', 'alex@leetcode.com');
    Truncate table Contacts;
    insert into Contacts (user_id, contact_name, contact_email) values ('1', 'Bob', 'bob@leetcode.com');
    insert into Contacts (user_id, contact_name, contact_email) values ('1', 'John', 'john@leetcode.com');
    insert into Contacts (user_id, contact_name, contact_email) values ('1', 'Jal', 'jal@leetcode.com');
    insert into Contacts (user_id, contact_name, contact_email) values ('2', 'Omar', 'omar@leetcode.com');
    insert into Contacts (user_id, contact_name, contact_email) values ('2', 'Meir', 'meir@leetcode.com');
    insert into Contacts (user_id, contact_name, contact_email) values ('6', 'Alice', 'alice@leetcode.com');
    Truncate table Invoices;
    insert into Invoices (invoice_id, price, user_id) values ('77', '100', '1');
    insert into Invoices (invoice_id, price, user_id) values ('88', '200', '1');
    insert into Invoices (invoice_id, price, user_id) values ('99', '300', '2');
    insert into Invoices (invoice_id, price, user_id) values ('66', '400', '2');
    insert into Invoices (invoice_id, price, user_id) values ('55', '500', '13');
    insert into Invoices (invoice_id, price, user_id) values ('44', '60', '6');
  • 分析,这道题最难的就是理解题目,该客户的联系人,和可信联系人,这两个非常难理解,我认为该客户的联系人就是Contacts 表中的所有联系人都是,可信联系人是指Contacts 表中邮箱在客户表中的人,这里我们首先先把Contacts 中的可信联系人标记出来,如果是可信联系人就标记为1 否则标记为0,然后分组求出每个人的联系人,还有每个人的可信联系人,全部联系人,这里是用count算出,可信联系人,这里是用sum标记列算出,然后连接三个表就得出来结果了,图表分析:

  • sql实现:

  • with t1 as (select *, if(contact_email in (select email from Customers), 1, 0) ll from Contacts),       -- 首先先给可信人员打上标签,可信人返回1 不可信人返回0
         t2 as (select invoice_id, price, user_id, customer_name
                from Invoices i1,
                     Customers c1
                where i1.user_id = c1.customer_id),   -- 然后连接发票表和用户表
         t3 as (select user_id, count(1) contacts_cnt, sum(ll) trusted_contacts_cnt from t1 group by user_id)  -- 然后算出所有联系人和可信联系人的人数
    select invoice_id,
           customer_name,
           price,
           ifnull(contacts_cnt, 0)         contacts_cnt,
           ifnull(trusted_contacts_cnt, 0) trusted_contacts_cnt
    from t2
             left join t3 on t2.user_id = t3.user_id order by invoice_id  -- 连接发票表和可信人数表然后人数如果为空,就返回零,否则返回人数,按照发票id排序
  • pandas例子:

  • data = [[1, 'Alice', 'alice@leetcode.com'], [2, 'Bob', 'bob@leetcode.com'], [13, 'John', 'john@leetcode.com'], [6, 'Alex', 'alex@leetcode.com']]
    customers = pd.DataFrame(data, columns=['customer_id', 'customer_name', 'email']).astype({'customer_id':'Int64', 'customer_name':'object', 'email':'object'})
    data = [[1, 'Bob', 'bob@leetcode.com'], [1, 'John', 'john@leetcode.com'], [1, 'Jal', 'jal@leetcode.com'], [2, 'Omar', 'omar@leetcode.com'], [2, 'Meir', 'meir@leetcode.com'], [6, 'Alice', 'alice@leetcode.com']]
    contacts = pd.DataFrame(data, columns=['user_id', 'contact_name', 'contact_email']).astype({'user_id':'Int64', 'contact_name':'object', 'contact_email':'object'})
    data = [[77, 100, 1], [88, 200, 1], [99, 300, 2], [66, 400, 2], [55, 500, 13], [44, 60, 6]]
    invoices = pd.DataFrame(data, columns=['invoice_id', 'price', 'user_id']).astype({'invoice_id':'Int64', 'price':'Int64', 'user_id':'Int64'})
  • pandas分析:大致与sql分析一样

  • pandas实现:

  • import pandas as pd
    
    def count_trusted_contacts(customers: pd.DataFrame, contacts: pd.DataFrame, invoices: pd.DataFrame) -> pd.DataFrame:
        contacts['cn']=contacts['contact_email'].apply(lambda x:1 if x in customers['email'].values else 0) -- 给联系表中的人打标签,如果是可信人返回1 否则返回零
    
        d=contacts.groupby('user_id').agg({'contact_name':'count','cn':'sum'}).reset_index()  -- 算出每个人的全部联系人和可信人数
    
        b=invoices.merge(customers,left_on='user_id',right_on='customer_id',how='left')  -- 连接发票表和客户表
    
        c=b.merge(d,left_on='user_id',right_on='user_id',how='left') -- 连接发票姓名表和联系人数和可信人数表
        c=c[['invoice_id','customer_name','price','contact_name','cn']].fillna(0).sort_values('invoice_id')  -- 把空值设置成0,然后排序
    
        c.columns=['invoice_id','customer_name','price','contacts_cnt','trusted_contacts_cnt'] -- 修改列名
        return c

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2203524.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

qiankun 主项目和子项目都是 vue2,部署在不同的服务器上,nginx 配置

1、主项目配置 1.1 micro.vue 组件 <template><div id"container-sub-app"></div> </template><script> import { loadMicroApp } from qiankun; import actions from /utils/actions.js;export default {name: microApp,mixins: [ac…

react实现实时计时的最简方式

js中时间的处理&#xff0c;不借助于moment/dayjs这样的工具库&#xff0c;原生获取格式化的时间&#xff0c;最简单的实现方式可以参考下面这样。 实现效果 代码实现 封装hooks import { useState, useEffect } from "react";export function useCountTime() {c…

Linux——which-find命令

which命令 查找命令的程序文件&#xff08;二进制 find命令 按文件名查找文件 find / -name "test" 命令 路径(根目录 命令选项 查找文件名 find命令 -name 模糊查询 find / -name "…

Linux:进程控制(三)——进程程序替换

目录 一、概念 二、使用 1.单进程程序替换 2.多进程程序替换 3.exec接口 4.execle 一、概念 背景 当前进程在运行的时候&#xff0c;所执行的代码来自于自己的源文件。使用fork创建子进程后&#xff0c;子进程执行的程序中代码内容和父进程是相同的&#xff0c;如果子进…

Python入门笔记(七)

文章目录 第十五章. 下载数据15.1 csv文件15.2 json文件 第十六章. 使用API16.1 requests 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。 点击跳转&#xff1a;人工智能从入门到精通教程 本文电子版获取…

猫头虎分享已解决Bug || Error: ERESOLVE unable to resolve dependency tree 解决方案

&#x1f42f; 猫头虎分享已解决Bug || Error: ERESOLVE unable to resolve dependency tree 解决方案 摘要 在前端开发中&#xff0c;尤其是使用 Node.js 和 npm 管理依赖时&#xff0c;ERESOLVE unable to resolve dependency tree 错误是很多开发者遇到的常见问题。这个 Bu…

ES 入门 -http-条件查询分页查询查询排序

第一种方法的url 地址: http://192.168.1.108:9200/shopping/_search?qcategory:小米 上述url地址的情况&#xff0c;对应的后面的参数信息包含中文&#xff0c;有些时候也会出现乱码导致无法查询到数据&#xff0c; 第二种方式进行body的row -json的传参方式. { "que…

双十一最值得购买的好物?这四款数码好物一定要收藏好!

随着双十一购物节的脚步日益临近&#xff0c;消费者们的热情也在逐渐升温&#xff0c;大家都在翘首以待这场年度购物狂欢。回顾过去&#xff0c;我在双十一期间入手的不少商品都显得格外物超所值&#xff0c;与平日相比确实省下了不少开支。我很高兴能够分享这些精明的购物心得…

【图论】(一)图论理论基础与岛屿问题

图论理论基础与岛屿问题 图论理论基础深度搜索&#xff08;dfs&#xff09;广度搜索&#xff08;bfs&#xff09;岛屿问题概述 岛屿数量岛屿数量-深搜版岛屿数量-广搜版 岛屿的最大面积孤岛的总面积沉没孤岛建造最大人工岛水流问题岛屿的周长 图论理论基础 这里仅对图论相关核…

《企业实战分享 · SonarQube10.x 代码质量推广手册》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

【AI算法岗面试八股面经【超全整理】——CV】

AI算法岗面试八股面经【超全整理】 概率论【AI算法岗面试八股面经【超全整理】——概率论】信息论【AI算法岗面试八股面经【超全整理】——信息论】机器学习【AI算法岗面试八股面经【超全整理】——机器学习】深度学习【AI算法岗面试八股面经【超全整理】——深度学习】NLP【A…

vbox创建虚拟机后用户没有root 权限

XXX is not in the sudoers file. This incident will be reported. 打开终端输入 Su - 输入密码进入root账户 终端visudo修改配置文件 添加如下代码&#xff1a;Syy ALL(ALL:ALL) ALL 编写完成后保存文件 ctrlO 后输入文件名 sudoers.tmp 后按Enter键 退出编辑器&#xf…

018 发布商品

文章目录 获取分类关联的品牌CategoryBrandController.javaCategoryBrandServiceImpl.javaBrandVo.java 获取分类下的所有分组&关联属性AttrGroupController.javaAttrGroupServiceImpl.java 保存七张表sqltb_spu_info.sqltb_spu_info_desc.sqltb_spu_images.sqltb_product_…

UE4 材质学习笔记06(布料着色器/体积冰着色器)

一.布料着色器 要编写一个着色器首先是看一些参考图片&#xff0c;我们需要找出一些布料特有的特征&#xff0c;下面是一个棉织物&#xff0c;可以看到布料边缘的纤维可以捕捉光线使得边缘看起来更亮 下面是缎子和丝绸的图片&#xff0c;与棉织物有几乎相反的效果&#xff0c;…

基于SPI的flash读写操作

1、实验目标 使用页写或连续写操作向Flash芯片写入数据&#xff0c;再使用数据读操作读取之前写入数据&#xff0c;将读取的数据使用串口传回PC机&#xff0c;使用串口助手传回数据并与之前写入数据比较&#xff0c;判断正误。 注意&#xff1a;在向Flash芯片写入数据之前&…

【Redis原理】数据结构(上)

文章目录 动态字符串(SDS)概念SDS特点SDS的优势 IntSet概念IntSet的特点升序统一的编码格式IntSet自动升级 Dict概念Dict特点Dict的伸缩Dict的扩容Dict收缩 Dict的rehash渐进式哈希 总结Dict的结构Dict的伸缩 动态字符串(SDS) 概念 Redis是使用C语言实现的,C语言字符串底层是…

【后端开发】自动化部署、服务管理、问题排查工具(cicd流水线,k8s集群,ELK日志)

【后端开发】自动化部署、服务管理、问题排查工具&#xff08;cicd流水线&#xff0c;k8s集群&#xff0c;ELK日志&#xff09; 文章目录 1、Devops与CICD流水线(TeamCity, Jenkins&#xff0c;GitHub Actions)2、Kubernetes 集群的管理和操作&#xff08;对比Portainer&#x…

【解决】Set-ExecutionPolicy不是内部或外部命令

简介 当使用 VsCode 配置Django项目时&#xff0c;需要配置环境&#xff0c;但是当切换至虚拟环境时&#xff0c;出现了下面的情况。 无法加载文件&#xff1a;D:\django\Scripts\Activate.ps1&#xff0c; 上述问题可通过下面的命令进行解决 解决方法 1 命令行(最好是管理员…

JVM进阶调优系列(1)类加载器原理一文讲透

今天开始写JVM调优系列&#xff0c;并发编程系列也会继续穿插连载&#xff0c;让各位同学闲暇之余有更多阅读选择。 起笔写第一篇&#xff0c;并不好写。首先要构思整个系列的大概框架&#xff0c;一个好的框架一定是深度上由浅入深、逻辑上有严格顺序&#xff0c;读者订阅跟踪…

免费获取的8个SVG图标库,轻松下载与复制!

SVG图标相比传统的JPG、PNG图标具有诸多优势&#xff0c;适用于各种类型的图像&#xff0c;不仅能在不同尺寸下保持清晰度&#xff0c;还具备高度压缩性和轻量特性&#xff0c;支持静态和动态效果。因此&#xff0c;SVG格式在网页设计中往往是优选。尽管如今有很多免费的图标库…