给老婆的一篇文章
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,老婆公司有个这样的需求:查询出某游戏的用户回流信息,当用户连续两天登陆,则判定为2日回流,如果间隔一天登陆,则判定为3日回流,如果间隔5天登陆,则判定为7日回流。用户数据间隔时间短为14天(固定)。准
千家信息网最后更新 2026年10月31日给老婆的一篇文章
老婆公司有个这样的需求:
查询出某游戏的用户回流信息,当用户连续两天登陆,则判定为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 yyyymmddFROM user_loginGROUP BY u_id;后来想想日期转换成INTEGER相减是不准确的(比如跨月),而且这样显示并不能解决需求。
好吧,考虑行转列。
行转列
行转列,需要case when枚举,好在日期只有14天,可以做到:
SELECT u_id, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180413' THEN login_date ELSE '' END AS d20180413, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180414' THEN login_date ELSE '' END AS d20180414, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180415' THEN login_date ELSE '' END AS d20180415, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180416' THEN login_date ELSE '' END AS d20180416, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180417' THEN login_date ELSE '' END AS d20180417, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180418' THEN login_date ELSE '' END AS d20180418, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180419' THEN login_date ELSE '' END AS d20180419, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180420' THEN login_date ELSE '' END AS d20180420, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180421' THEN login_date ELSE '' END AS d20180421, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180422' THEN login_date ELSE '' END AS d20180422, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180423' THEN login_date ELSE '' END AS d20180423, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180424' THEN login_date ELSE '' END AS d20180424, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180425' THEN login_date ELSE '' END AS d20180425, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180426' THEN login_date ELSE '' END AS d20180426 FROM user_login查询结果:

按用户合并
按用户合并日期,去重,用max可以保证单条数据,有数据置为1无数据置为0:
SELECT u_id, CASE WHEN MAX(d20180413) = '' THEN '0' ELSE '1' END AS isZ20180413, CASE WHEN MAX(d20180414) = '' THEN '0' ELSE '1' END AS isZ20180414, CASE WHEN MAX(d20180415) = '' THEN '0' ELSE '1' END AS isZ20180415, CASE WHEN MAX(d20180416) = '' THEN '0' ELSE '1' END AS isZ20180416, CASE WHEN MAX(d20180417) = '' THEN '0' ELSE '1' END AS isZ20180417, CASE WHEN MAX(d20180418) = '' THEN '0' ELSE '1' END AS isZ20180418, CASE WHEN MAX(d20180419) = '' THEN '0' ELSE '1' END AS isZ20180419, CASE WHEN MAX(d20180420) = '' THEN '0' ELSE '1' END AS isZ20180420, CASE WHEN MAX(d20180421) = '' THEN '0' ELSE '1' END AS isZ20180421, CASE WHEN MAX(d20180422) = '' THEN '0' ELSE '1' END AS isZ20180422, CASE WHEN MAX(d20180423) = '' THEN '0' ELSE '1' END AS isZ20180423, CASE WHEN MAX(d20180424) = '' THEN '0' ELSE '1' END AS isZ20180424, CASE WHEN MAX(d20180425) = '' THEN '0' ELSE '1' END AS isZ20180425, CASE WHEN MAX(d20180426) = '' THEN '0' ELSE '1' END AS isZ20180426 FROM (SELECT u_id, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180413' THEN login_date ELSE '' END AS d20180413, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180414' THEN login_date ELSE '' END AS d20180414, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180415' THEN login_date ELSE '' END AS d20180415, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180416' THEN login_date ELSE '' END AS d20180416, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180417' THEN login_date ELSE '' END AS d20180417, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180418' THEN login_date ELSE '' END AS d20180418, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180419' THEN login_date ELSE '' END AS d20180419, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180420' THEN login_date ELSE '' END AS d20180420, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180421' THEN login_date ELSE '' END AS d20180421, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180422' THEN login_date ELSE '' END AS d20180422, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180423' THEN login_date ELSE '' END AS d20180423, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180424' THEN login_date ELSE '' END AS d20180424, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180425' THEN login_date ELSE '' END AS d20180425, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180426' THEN login_date ELSE '' END AS d20180426 FROM user_login) t0 GROUP BY u_id查询结果:
列转行
使用group_concat:
SELECT u_id, CONCAT(isZ20180413, isZ20180414, isZ20180415, isZ20180416, isZ20180417, isZ20180418, isZ20180419, isZ20180420, isZ20180421, isZ20180422, isZ20180423, isZ20180424, isZ20180425, isZ20180426) AS sumIsZ FROM (SELECT u_id, CASE WHEN MAX(d20180413) = '' THEN '0' ELSE '1' END AS isZ20180413, CASE WHEN MAX(d20180414) = '' THEN '0' ELSE '1' END AS isZ20180414, CASE WHEN MAX(d20180415) = '' THEN '0' ELSE '1' END AS isZ20180415, CASE WHEN MAX(d20180416) = '' THEN '0' ELSE '1' END AS isZ20180416, CASE WHEN MAX(d20180417) = '' THEN '0' ELSE '1' END AS isZ20180417, CASE WHEN MAX(d20180418) = '' THEN '0' ELSE '1' END AS isZ20180418, CASE WHEN MAX(d20180419) = '' THEN '0' ELSE '1' END AS isZ20180419, CASE WHEN MAX(d20180420) = '' THEN '0' ELSE '1' END AS isZ20180420, CASE WHEN MAX(d20180421) = '' THEN '0' ELSE '1' END AS isZ20180421, CASE WHEN MAX(d20180422) = '' THEN '0' ELSE '1' END AS isZ20180422, CASE WHEN MAX(d20180423) = '' THEN '0' ELSE '1' END AS isZ20180423, CASE WHEN MAX(d20180424) = '' THEN '0' ELSE '1' END AS isZ20180424, CASE WHEN MAX(d20180425) = '' THEN '0' ELSE '1' END AS isZ20180425, CASE WHEN MAX(d20180426) = '' THEN '0' ELSE '1' END AS isZ20180426 FROM (SELECT u_id, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180413' THEN login_date ELSE '' END AS d20180413, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180414' THEN login_date ELSE '' END AS d20180414, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180415' THEN login_date ELSE '' END AS d20180415, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180416' THEN login_date ELSE '' END AS d20180416, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180417' THEN login_date ELSE '' END AS d20180417, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180418' THEN login_date ELSE '' END AS d20180418, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180419' THEN login_date ELSE '' END AS d20180419, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180420' THEN login_date ELSE '' END AS d20180420, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180421' THEN login_date ELSE '' END AS d20180421, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180422' THEN login_date ELSE '' END AS d20180422, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180423' THEN login_date ELSE '' END AS d20180423, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180424' THEN login_date ELSE '' END AS d20180424, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180425' THEN login_date ELSE '' END AS d20180425, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180426' THEN login_date ELSE '' END AS d20180426 FROM user_login) t0 GROUP BY u_id) t1查询结果:
统计
SELECT u_id, sumIsZ, CASE WHEN LOCATE('11', sumIsZ) > 0 THEN 2 ELSE 0 END AS is2Back,/*2日回流*/ CASE WHEN LOCATE('101', sumIsZ) > 0 THEN 3 ELSE 0 END AS is3Back,/*3日回流*/ CASE WHEN LOCATE('1001', sumIsZ) > 0 THEN 4 ELSE 0 END AS is4Back,/*4日回流*/ CASE WHEN LOCATE('10001', sumIsZ) > 0 THEN 5 ELSE 0 END AS is5Back,/*5日回流*/ CASE WHEN LOCATE('100001', sumIsZ) > 0 THEN 6 ELSE 0 END AS is6Back,/*6日回流*/ CASE WHEN LOCATE('1000001', sumIsZ) > 0 THEN 7 ELSE 0 END AS is7Back/*7日回流*/FROM (SELECT u_id, CONCAT(isZ20180413, isZ20180414, isZ20180415, isZ20180416, isZ20180417, isZ20180418, isZ20180419, isZ20180420, isZ20180421, isZ20180422, isZ20180423, isZ20180424, isZ20180425, isZ20180426) AS sumIsZ FROM (SELECT u_id, CASE WHEN MAX(d20180413) = '' THEN '0' ELSE '1' END AS isZ20180413, CASE WHEN MAX(d20180414) = '' THEN '0' ELSE '1' END AS isZ20180414, CASE WHEN MAX(d20180415) = '' THEN '0' ELSE '1' END AS isZ20180415, CASE WHEN MAX(d20180416) = '' THEN '0' ELSE '1' END AS isZ20180416, CASE WHEN MAX(d20180417) = '' THEN '0' ELSE '1' END AS isZ20180417, CASE WHEN MAX(d20180418) = '' THEN '0' ELSE '1' END AS isZ20180418, CASE WHEN MAX(d20180419) = '' THEN '0' ELSE '1' END AS isZ20180419, CASE WHEN MAX(d20180420) = '' THEN '0' ELSE '1' END AS isZ20180420, CASE WHEN MAX(d20180421) = '' THEN '0' ELSE '1' END AS isZ20180421, CASE WHEN MAX(d20180422) = '' THEN '0' ELSE '1' END AS isZ20180422, CASE WHEN MAX(d20180423) = '' THEN '0' ELSE '1' END AS isZ20180423, CASE WHEN MAX(d20180424) = '' THEN '0' ELSE '1' END AS isZ20180424, CASE WHEN MAX(d20180425) = '' THEN '0' ELSE '1' END AS isZ20180425, CASE WHEN MAX(d20180426) = '' THEN '0' ELSE '1' END AS isZ20180426 FROM (SELECT u_id, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180413' THEN login_date ELSE '' END AS d20180413, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180414' THEN login_date ELSE '' END AS d20180414, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180415' THEN login_date ELSE '' END AS d20180415, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180416' THEN login_date ELSE '' END AS d20180416, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180417' THEN login_date ELSE '' END AS d20180417, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180418' THEN login_date ELSE '' END AS d20180418, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180419' THEN login_date ELSE '' END AS d20180419, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180420' THEN login_date ELSE '' END AS d20180420, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180421' THEN login_date ELSE '' END AS d20180421, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180422' THEN login_date ELSE '' END AS d20180422, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180423' THEN login_date ELSE '' END AS d20180423, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180424' THEN login_date ELSE '' END AS d20180424, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180425' THEN login_date ELSE '' END AS d20180425, CASE DATE_FORMAT(login_date, '%Y%m%d') WHEN '20180426' THEN login_date ELSE '' END AS d20180426 FROM user_login) t0 GROUP BY u_id) t1) t2;查询结果:
结语
老婆,明天照着这个逻辑写就可以了,么么哒。(2018年4月26日23点50分)
数据
用户
查询
结果
日期
登陆
老婆
需求
么么
一致
信息
公司
只有
时间
时间短
照着
结语
语法
逻辑
保证
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
咖啡
A股互联网金融科技公司
疫情对互联网科技公司影响
深圳科技互联网
壹账通互联网科技
上海万想互联网科技
美国互联网前沿科技
字节跳动和互联网科技
互联网科技教育视频
华服互联网科技官网
宝灵互联网科技有限公司
中国航天科技大学国际工业互联网
乌苏新华互联网科技做什么的
互联网科技和法律行业
互联网时代的科技公司
上海科技产业互联网平台
深圳互联网科技的发展
江苏苏星互联网科技有限公司
广州燕处互联网科技有限公司
马化腾互联网科技教学
什么是科技互联网
科技平台互联网
互联网科技集团
深圳期待互联网科技
中国互联网有什么科技含量
速维有品互联网信息科技(苏州)有限公司
广州市恰铎互联网科技有限公司
江苏互联网智能科技软件
恒生互联网科技趋势
中国主要互联网科技公司