给老婆的一篇文章

2024-03-11 18:32
文章标签 文章 一篇 老婆

本文主要是介绍给老婆的一篇文章,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

老婆公司有个这样的需求:

查询出王者荣耀的用户回流信息,当用户连续两天登陆,则判定为2日回流,如果间隔一天登陆,则判定为3日回流,如果间隔5天登陆,则判定为7日回流。用户数据间隔时间短为14天(固定)。

准备数据

database语法和mysql一致。

创建表:

create table user_login(
u_id int,
login_date timestamp default current_timestamp
);

插入数据:

DELIMITER //
create procedure loop_insert()
begindeclare days int;
declare usrs int;
declare mx int;
declare i int;set days = 14;
set usrs = 30;
set mx = 500;
set i = 1;repeat insert into user_login(u_id,login_date) values (floor((RAND() * usrs)),subdate(sysdate(),(RAND() * (days+1))));set i = i + 1;
until i >= mxend repeat;end//
call loop_insert();

最开始我想到的是用group_concat,sql是这样:

SELECT u_id, group_concat(distinct DATE_FORMAT(login_date, '%Y%m%d') order by DATE_FORMAT(login_date, '%Y%m%d') desc separator '-') AS yyyymmdd
FROMuser_login
GROUP BY u_id;

这里写图片描述

后来想想日期转换成INTEGER相减是不准确的(比如跨月),而且这样显示并不能解决需求。

好吧,考虑行转列。

行转列 ##

行转列,需要case when枚举,好在日期只有14天,可以做到:

SELECT u_id,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180413' THEN login_dateELSE ''END AS d20180413,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180414' THEN login_dateELSE ''END AS d20180414,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180415' THEN login_dateELSE ''END AS d20180415,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180416' THEN login_dateELSE ''END AS d20180416,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180417' THEN login_dateELSE ''END AS d20180417,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180418' THEN login_dateELSE ''END AS d20180418,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180419' THEN login_dateELSE ''END AS d20180419,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180420' THEN login_dateELSE ''END AS d20180420,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180421' THEN login_dateELSE ''END AS d20180421,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180422' THEN login_dateELSE ''END AS d20180422,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180423' THEN login_dateELSE ''END AS d20180423,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180424' THEN login_dateELSE ''END AS d20180424,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180425' THEN login_dateELSE ''END AS d20180425,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180426' THEN login_dateELSE ''END AS d20180426FROMuser_login

查询结果:

这里写图片描述

按用户合并

按用户合并日期,去重,用max可以保证单条数据,有数据置为1无数据置为0:

SELECT u_id,CASEWHEN MAX(d20180413) = '' THEN '0'ELSE '1'END AS isZ20180413,CASEWHEN MAX(d20180414) = '' THEN '0'ELSE '1'END AS isZ20180414,CASEWHEN MAX(d20180415) = '' THEN '0'ELSE '1'END AS isZ20180415,CASEWHEN MAX(d20180416) = '' THEN '0'ELSE '1'END AS isZ20180416,CASEWHEN MAX(d20180417) = '' THEN '0'ELSE '1'END AS isZ20180417,CASEWHEN MAX(d20180418) = '' THEN '0'ELSE '1'END AS isZ20180418,CASEWHEN MAX(d20180419) = '' THEN '0'ELSE '1'END AS isZ20180419,CASEWHEN MAX(d20180420) = '' THEN '0'ELSE '1'END AS isZ20180420,CASEWHEN MAX(d20180421) = '' THEN '0'ELSE '1'END AS isZ20180421,CASEWHEN MAX(d20180422) = '' THEN '0'ELSE '1'END AS isZ20180422,CASEWHEN MAX(d20180423) = '' THEN '0'ELSE '1'END AS isZ20180423,CASEWHEN MAX(d20180424) = '' THEN '0'ELSE '1'END AS isZ20180424,CASEWHEN MAX(d20180425) = '' THEN '0'ELSE '1'END AS isZ20180425,CASEWHEN MAX(d20180426) = '' THEN '0'ELSE '1'END AS isZ20180426FROM(SELECT u_id,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180413' THEN login_dateELSE ''END AS d20180413,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180414' THEN login_dateELSE ''END AS d20180414,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180415' THEN login_dateELSE ''END AS d20180415,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180416' THEN login_dateELSE ''END AS d20180416,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180417' THEN login_dateELSE ''END AS d20180417,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180418' THEN login_dateELSE ''END AS d20180418,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180419' THEN login_dateELSE ''END AS d20180419,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180420' THEN login_dateELSE ''END AS d20180420,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180421' THEN login_dateELSE ''END AS d20180421,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180422' THEN login_dateELSE ''END AS d20180422,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180423' THEN login_dateELSE ''END AS d20180423,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180424' THEN login_dateELSE ''END AS d20180424,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180425' THEN login_dateELSE ''END AS d20180425,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180426' THEN login_dateELSE ''END AS d20180426FROMuser_login) t0GROUP BY u_id

查询结果:

这里写图片描述

列转行

使用group_concat:

SELECT u_id,CONCAT(isZ20180413, isZ20180414, isZ20180415, isZ20180416, isZ20180417, isZ20180418, isZ20180419, isZ20180420, isZ20180421, isZ20180422, isZ20180423, isZ20180424, isZ20180425, isZ20180426) AS sumIsZFROM(SELECT u_id,CASEWHEN MAX(d20180413) = '' THEN '0'ELSE '1'END AS isZ20180413,CASEWHEN MAX(d20180414) = '' THEN '0'ELSE '1'END AS isZ20180414,CASEWHEN MAX(d20180415) = '' THEN '0'ELSE '1'END AS isZ20180415,CASEWHEN MAX(d20180416) = '' THEN '0'ELSE '1'END AS isZ20180416,CASEWHEN MAX(d20180417) = '' THEN '0'ELSE '1'END AS isZ20180417,CASEWHEN MAX(d20180418) = '' THEN '0'ELSE '1'END AS isZ20180418,CASEWHEN MAX(d20180419) = '' THEN '0'ELSE '1'END AS isZ20180419,CASEWHEN MAX(d20180420) = '' THEN '0'ELSE '1'END AS isZ20180420,CASEWHEN MAX(d20180421) = '' THEN '0'ELSE '1'END AS isZ20180421,CASEWHEN MAX(d20180422) = '' THEN '0'ELSE '1'END AS isZ20180422,CASEWHEN MAX(d20180423) = '' THEN '0'ELSE '1'END AS isZ20180423,CASEWHEN MAX(d20180424) = '' THEN '0'ELSE '1'END AS isZ20180424,CASEWHEN MAX(d20180425) = '' THEN '0'ELSE '1'END AS isZ20180425,CASEWHEN MAX(d20180426) = '' THEN '0'ELSE '1'END AS isZ20180426FROM(SELECT u_id,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180413' THEN login_dateELSE ''END AS d20180413,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180414' THEN login_dateELSE ''END AS d20180414,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180415' THEN login_dateELSE ''END AS d20180415,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180416' THEN login_dateELSE ''END AS d20180416,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180417' THEN login_dateELSE ''END AS d20180417,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180418' THEN login_dateELSE ''END AS d20180418,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180419' THEN login_dateELSE ''END AS d20180419,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180420' THEN login_dateELSE ''END AS d20180420,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180421' THEN login_dateELSE ''END AS d20180421,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180422' THEN login_dateELSE ''END AS d20180422,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180423' THEN login_dateELSE ''END AS d20180423,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180424' THEN login_dateELSE ''END AS d20180424,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180425' THEN login_dateELSE ''END AS d20180425,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180426' THEN login_dateELSE ''END AS d20180426FROMuser_login) t0GROUP BY u_id) t1

查询结果:

这里写图片描述

统计

SELECT u_id,sumIsZ,CASEWHEN LOCATE('11', sumIsZ) > 0 THEN 2ELSE 0END AS is2Back,/*2日回流*/CASEWHEN LOCATE('101', sumIsZ) > 0 THEN 3ELSE 0END AS is3Back,/*3日回流*/CASEWHEN LOCATE('1001', sumIsZ) > 0 THEN 4ELSE 0END AS is4Back,/*4日回流*/CASEWHEN LOCATE('10001', sumIsZ) > 0 THEN 5ELSE 0END AS is5Back,/*5日回流*/CASEWHEN LOCATE('100001', sumIsZ) > 0 THEN 6ELSE 0END AS is6Back,/*6日回流*/CASEWHEN LOCATE('1000001', sumIsZ) > 0 THEN 7ELSE 0END AS is7Back/*7日回流*/
FROM(SELECT u_id,CONCAT(isZ20180413, isZ20180414, isZ20180415, isZ20180416, isZ20180417, isZ20180418, isZ20180419, isZ20180420, isZ20180421, isZ20180422, isZ20180423, isZ20180424, isZ20180425, isZ20180426) AS sumIsZFROM(SELECT u_id,CASEWHEN MAX(d20180413) = '' THEN '0'ELSE '1'END AS isZ20180413,CASEWHEN MAX(d20180414) = '' THEN '0'ELSE '1'END AS isZ20180414,CASEWHEN MAX(d20180415) = '' THEN '0'ELSE '1'END AS isZ20180415,CASEWHEN MAX(d20180416) = '' THEN '0'ELSE '1'END AS isZ20180416,CASEWHEN MAX(d20180417) = '' THEN '0'ELSE '1'END AS isZ20180417,CASEWHEN MAX(d20180418) = '' THEN '0'ELSE '1'END AS isZ20180418,CASEWHEN MAX(d20180419) = '' THEN '0'ELSE '1'END AS isZ20180419,CASEWHEN MAX(d20180420) = '' THEN '0'ELSE '1'END AS isZ20180420,CASEWHEN MAX(d20180421) = '' THEN '0'ELSE '1'END AS isZ20180421,CASEWHEN MAX(d20180422) = '' THEN '0'ELSE '1'END AS isZ20180422,CASEWHEN MAX(d20180423) = '' THEN '0'ELSE '1'END AS isZ20180423,CASEWHEN MAX(d20180424) = '' THEN '0'ELSE '1'END AS isZ20180424,CASEWHEN MAX(d20180425) = '' THEN '0'ELSE '1'END AS isZ20180425,CASEWHEN MAX(d20180426) = '' THEN '0'ELSE '1'END AS isZ20180426FROM(SELECT u_id,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180413' THEN login_dateELSE ''END AS d20180413,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180414' THEN login_dateELSE ''END AS d20180414,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180415' THEN login_dateELSE ''END AS d20180415,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180416' THEN login_dateELSE ''END AS d20180416,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180417' THEN login_dateELSE ''END AS d20180417,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180418' THEN login_dateELSE ''END AS d20180418,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180419' THEN login_dateELSE ''END AS d20180419,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180420' THEN login_dateELSE ''END AS d20180420,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180421' THEN login_dateELSE ''END AS d20180421,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180422' THEN login_dateELSE ''END AS d20180422,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180423' THEN login_dateELSE ''END AS d20180423,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180424' THEN login_dateELSE ''END AS d20180424,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180425' THEN login_dateELSE ''END AS d20180425,CASE DATE_FORMAT(login_date, '%Y%m%d')WHEN '20180426' THEN login_dateELSE ''END AS d20180426FROMuser_login) t0GROUP BY u_id) t1) t2
;

查询结果:

这里写图片描述

结语

老婆,明天照着这个逻辑写就可以了,么么哒。(2018年4月26日23点50分)

这篇关于给老婆的一篇文章的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

java计算机毕设课设—停车管理信息系统(附源码、文章、相关截图、部署视频)

这是什么系统? 资源获取方式在最下方 java计算机毕设课设—停车管理信息系统(附源码、文章、相关截图、部署视频) 停车管理信息系统是为了提升停车场的运营效率和管理水平而设计的综合性平台。系统涵盖用户信息管理、车位管理、收费管理、违规车辆处理等多个功能模块,旨在实现对停车场资源的高效配置和实时监控。此外,系统还提供了资讯管理和统计查询功能,帮助管理者及时发布信息并进行数据分析,为停车场的科学

CSP-J基础之数学基础 初等数论 一篇搞懂(一)

文章目录 前言声明初等数论是什么初等数论历史1. **古代时期**2. **中世纪时期**3. **文艺复兴与近代**4. **现代时期** 整数的整除性约数什么样的整数除什么样的整数才能得到整数?条件:举例说明:一般化: 判断两个数能否被整除 因数与倍数质数与复合数使用开根号法判定质数哥德巴赫猜想最大公因数与辗转相除法计算最大公因数的常用方法:举几个例子:例子 1: 计算 12 和 18

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑燃料电池和电解槽虚拟惯量支撑的电力系统优化调度方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python

CSP-J基础之数学基础 初等数论 一篇搞懂(二)

文章目录 前言算术基本定理简介什么是质数?举个简单例子:重要的结论:算术基本定理公式解释:举例: 算术基本定理的求法如何找出质因数:举个简单的例子: 重要的步骤:C++实现 同余举个例子:同余的性质简介1. 同余的自反性2. 同余的对称性3. 同余的传递性4. 同余的加法性质5. 同余的乘法性质 推论 总结 前言 在计算机科学和数学中,初等数论是一个重要的基础领域,涉及到整数

【Linux】萌新看过来!一篇文章带你走进Linux世界

🚀个人主页:奋斗的小羊 🚀所属专栏:Linux 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 前言💥1、初识Linux💥1.1 什么是操作系统?💥1.2 各种操作系统对比💥1.3 现代Linux应用💥1.4 Linux常用版本 💥2、Linux 和 Windows 目录结构对比💥2.1 文件系统组织方式💥2.2

多线程的系列文章

Java多线程学习(一)Java多线程入门 Java多线程学习(二)synchronized关键字(1)   Java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Java多线程学习(四)等待/通知(wait/notify)机制 Java多线程学习(五)线程间通信知识点补充 Java多线程学习(六)Lock锁的使用 Java多

缓存的常见问题 以及解决博客文章

1.jedispool 连 redis 高并发卡死  (子非鱼yy) https://blog.csdn.net/ztx114/article/details/78291734 2. Redis安装及主从配置 https://blog.csdn.net/ztx114/article/details/78320193 3.Spring中使用RedisTemplate操作Redis(sprin

java计算机毕设课设—企业员工信息管理系统(附源码、文章、相关截图、部署视频)

这是什么系统? 获取资料方式在最下方 java计算机毕设课设—企业员工信息管理系统(附源码、文章、相关截图、部署视频) 企业员工信息管理系统旨在为公司提供高效的员工信息管理解决方案。该系统的核心功能涵盖密码修改、员工管理、部门管理、出勤管理、工资管理、请假审核等方面,帮助企业优化人力资源管理流程。系统结构如下: (1)前端(员工端): 1.密码修改:员工可以修改自己的密码,提升账户的安全

AI产品经理:ai产品经理从零基础到精通,非常详细收藏我这一篇就够了

在互联网的浪潮中,AI人工智能领域无疑是最引人注目的风口。AI产品经理,作为这一领域的新兴岗位,以其高薪、低压力、无年龄限制等优势,吸引了众多互联网从业者的目光。随着GPT等AIGC工具的兴起,AI产品经理的市场需求日益增长。 AI产品经理需不需要懂算法?🤔‍‍‍ AI产品经理不必像算法工程师那样精通算法,但必须能够与算法工程师有效沟通,了解如何管理AI项目,协调项目资源。 成功转行AI产

android的工程和代码的命名规范(第一篇文章,勿喷)

1。首先我们从编译代码的工具说起吧:工程中的注释一般都是中文写的(毕竟大家都是中国人,还是习惯于中文)这样就设计到乱码的问题了;对于这类问题,我们一般最好的处理方法就是将工程设置成 UTF-8 的格式;下面就说说怎么将工作空间或者是工程设置成UTF-8 的格式吧(当然我这里面说的是eclips