统计截止当天只出现两次的用户ID

Hx_Moon_ 2017-03-23 09:46:23
各位大拿,如题统计截止当天只出现两次的用户ID 同一天出现两次只算一次,查询结果如下
日期 人数
2017-03-20 0
2017-03-21 1
2017-03-22 2
注解:如下表当统计20号时,没有两次出现的uid 所以为0
当统计21号的人数时,过去出现过一次的只有uid为10这一人,这一天出现两次uid10 只算一次

CREATE TABLE `recharge` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`uid` int(11) DEFAULT NULL,
`dt` date DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of recharge
-- ----------------------------
INSERT INTO `recharge` VALUES ('1', '10', '2017-03-20');
INSERT INTO `recharge` VALUES ('2', '11', '2017-03-20');
INSERT INTO `recharge` VALUES ('3', '10', '2017-03-21');
INSERT INTO `recharge` VALUES ('12', '10', '2017-03-21');
INSERT INTO `recharge` VALUES ('4', '12', '2017-03-21');
INSERT INTO `recharge` VALUES ('10', '13', '2017-03-21');
INSERT INTO `recharge` VALUES ('11', '14', '2017-03-21');
INSERT INTO `recharge` VALUES ('9', '15', '2017-03-21');
INSERT INTO `recharge` VALUES ('5', '10', '2017-03-22');
INSERT INTO `recharge` VALUES ('6', '14', '2017-03-22');
INSERT INTO `recharge` VALUES ('7', '15', '2017-03-22');
INSERT INTO `recharge` VALUES ('8', '11', '2017-03-22');


...全文
132 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hx_Moon_ 2017-03-23
  • 打赏
  • 举报
回复
引用 2 楼 sinat_28984567 的回复:
22号的,测试数据的结果应该是0吧?
SELECT t1.dt,
(select COUNT(1) as 人数 from (
select uid,dt,COUNT(DISTINCT id) as 人数 
from recharge GROUP BY uid,dt )t
where t.人数  = 2 and t.dt = t1.dt)as 人数
FROM (SELECT DISTINCT dt from recharge)t1
22号 有14,15,11三个用户都在过去出现过一次,所以应该是3个
Hx_Moon_ 2017-03-23
  • 打赏
  • 举报
回复
引用 1 楼 cloudmissing 的回复:
[quote=引用 楼主 linux_PHP_ 的回复:] 各位大拿,如题统计截止当天只出现两次的用户ID 同一天出现两次只算一次,查询结果如下 日期 人数 2017-03-20 0 2017-03-21 1 2017-03-22 2 注解:如下表当统计20号时,没有两次出现的uid 所以为0 当统计21号的人数时,过去出现过一次的只有uid为10这一人,这一天出现两次uid10 只算一次

CREATE TABLE `recharge` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `uid` int(11) DEFAULT NULL,
  `dt` date DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of recharge
-- ----------------------------
INSERT INTO `recharge` VALUES ('1', '10', '2017-03-20');
INSERT INTO `recharge` VALUES ('2', '11', '2017-03-20');
INSERT INTO `recharge` VALUES ('3', '10', '2017-03-21');
INSERT INTO `recharge` VALUES ('12', '10', '2017-03-21');
INSERT INTO `recharge` VALUES ('4', '12', '2017-03-21');
INSERT INTO `recharge` VALUES ('10', '13', '2017-03-21');
INSERT INTO `recharge` VALUES ('11', '14', '2017-03-21');
INSERT INTO `recharge` VALUES ('9', '15', '2017-03-21');
INSERT INTO `recharge` VALUES ('5', '10', '2017-03-22');
INSERT INTO `recharge` VALUES ('6', '14', '2017-03-22');
INSERT INTO `recharge` VALUES ('7', '15', '2017-03-22');
INSERT INTO `recharge` VALUES ('8', '11', '2017-03-22');


如果同1人同一天,出现大于两次,如果3次,4次等,算几次? 如果同1人,20号 出现1次,21号出现2次,22号出现1次。 总共算几次。 1次?[/quote] 当天出现不管多少次都算一次
二月十六 2017-03-23
  • 打赏
  • 举报
回复
22号的,测试数据的结果应该是0吧?
SELECT t1.dt,
(select COUNT(1) as 人数 from (
select uid,dt,COUNT(DISTINCT id) as 人数
from recharge GROUP BY uid,dt )t
where t.人数 = 2 and t.dt = t1.dt)as 人数
FROM (SELECT DISTINCT dt from recharge)t1


cloudmissing 2017-03-23
  • 打赏
  • 举报
回复
引用 楼主 linux_PHP_ 的回复:
各位大拿,如题统计截止当天只出现两次的用户ID 同一天出现两次只算一次,查询结果如下 日期 人数 2017-03-20 0 2017-03-21 1 2017-03-22 2 注解:如下表当统计20号时,没有两次出现的uid 所以为0 当统计21号的人数时,过去出现过一次的只有uid为10这一人,这一天出现两次uid10 只算一次

CREATE TABLE `recharge` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `uid` int(11) DEFAULT NULL,
  `dt` date DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of recharge
-- ----------------------------
INSERT INTO `recharge` VALUES ('1', '10', '2017-03-20');
INSERT INTO `recharge` VALUES ('2', '11', '2017-03-20');
INSERT INTO `recharge` VALUES ('3', '10', '2017-03-21');
INSERT INTO `recharge` VALUES ('12', '10', '2017-03-21');
INSERT INTO `recharge` VALUES ('4', '12', '2017-03-21');
INSERT INTO `recharge` VALUES ('10', '13', '2017-03-21');
INSERT INTO `recharge` VALUES ('11', '14', '2017-03-21');
INSERT INTO `recharge` VALUES ('9', '15', '2017-03-21');
INSERT INTO `recharge` VALUES ('5', '10', '2017-03-22');
INSERT INTO `recharge` VALUES ('6', '14', '2017-03-22');
INSERT INTO `recharge` VALUES ('7', '15', '2017-03-22');
INSERT INTO `recharge` VALUES ('8', '11', '2017-03-22');


如果同1人同一天,出现大于两次,如果3次,4次等,算几次? 如果同1人,20号 出现1次,21号出现2次,22号出现1次。 总共算几次。 1次?
Hx_Moon_ 2017-03-23
  • 打赏
  • 举报
回复
引用 10 楼 sinat_28984567 的回复:
[quote=引用 9 楼 linux_PHP_ 的回复:] [quote=引用 8 楼 sinat_28984567 的回复:]
select uid,dt,COUNT(DISTINCT uid) as num from recharge group by uid,dt #t1代表 每天谁去过
select DISTINCT dt from recharge  #t2代表 一共多少天

#简化了点

select dt,(SELECT COUNT(DISTINCT uid) from (select t1.uid,t2.dt,COUNT(1) as 人数 from (
select uid,dt,COUNT(DISTINCT uid) as 人数 from recharge GROUP BY uid,dt
)t1 join (select DISTINCT dt from recharge)t2 on t1.dt<=t2.dt
GROUP BY t1.uid,t2.dt)t4 where t4.dt = t3.dt and t4.人数=2) as 人数 from (select DISTINCT dt from recharge)t3 
好像还是不对 22号应该有14,15,11三个人才对 我最上面那个写错了, 业务逻辑是统计每天出现的用户,并且这些用户在过去天数里只出现过一次[/quote] 额,这个语句统计出来22号是三个啊[/quote] 嗯嗯,是的。有点小复杂啊
二月十六 2017-03-23
  • 打赏
  • 举报
回复
引用 9 楼 linux_PHP_ 的回复:
[quote=引用 8 楼 sinat_28984567 的回复:]
select uid,dt,COUNT(DISTINCT uid) as num from recharge group by uid,dt #t1代表 每天谁去过
select DISTINCT dt from recharge  #t2代表 一共多少天

#简化了点

select dt,(SELECT COUNT(DISTINCT uid) from (select t1.uid,t2.dt,COUNT(1) as 人数 from (
select uid,dt,COUNT(DISTINCT uid) as 人数 from recharge GROUP BY uid,dt
)t1 join (select DISTINCT dt from recharge)t2 on t1.dt<=t2.dt
GROUP BY t1.uid,t2.dt)t4 where t4.dt = t3.dt and t4.人数=2) as 人数 from (select DISTINCT dt from recharge)t3 
好像还是不对 22号应该有14,15,11三个人才对 我最上面那个写错了, 业务逻辑是统计每天出现的用户,并且这些用户在过去天数里只出现过一次[/quote] 额,这个语句统计出来22号是三个啊
Hx_Moon_ 2017-03-23
  • 打赏
  • 举报
回复
引用 8 楼 sinat_28984567 的回复:
select uid,dt,COUNT(DISTINCT uid) as num from recharge group by uid,dt #t1代表 每天谁去过
select DISTINCT dt from recharge  #t2代表 一共多少天

#简化了点

select dt,(SELECT COUNT(DISTINCT uid) from (select t1.uid,t2.dt,COUNT(1) as 人数 from (
select uid,dt,COUNT(DISTINCT uid) as 人数 from recharge GROUP BY uid,dt
)t1 join (select DISTINCT dt from recharge)t2 on t1.dt<=t2.dt
GROUP BY t1.uid,t2.dt)t4 where t4.dt = t3.dt and t4.人数=2) as 人数 from (select DISTINCT dt from recharge)t3 
好像还是不对 22号应该有14,15,11三个人才对 我最上面那个写错了, 业务逻辑是统计每天出现的用户,并且这些用户在过去天数里只出现过一次
二月十六 2017-03-23
  • 打赏
  • 举报
回复
select uid,dt,COUNT(DISTINCT uid) as num from recharge group by uid,dt #t1代表 每天谁去过
select DISTINCT dt from recharge  #t2代表 一共多少天

#简化了点

select dt,(SELECT COUNT(DISTINCT uid) from (select t1.uid,t2.dt,COUNT(1) as 人数 from (
select uid,dt,COUNT(DISTINCT uid) as 人数 from recharge GROUP BY uid,dt
)t1 join (select DISTINCT dt from recharge)t2 on t1.dt<=t2.dt
GROUP BY t1.uid,t2.dt)t4 where t4.dt = t3.dt and t4.人数=2) as 人数 from (select DISTINCT dt from recharge)t3 
Hx_Moon_ 2017-03-23
  • 打赏
  • 举报
回复
引用 6 楼 sinat_28984567 的回复:
我看看再清楚清楚。。。上边那个稍微麻烦点
嗯嗯,厉害啊,感觉已经超出我理解的范围之外了。。
二月十六 2017-03-23
  • 打赏
  • 举报
回复
我看看再清楚清楚。。。上边那个稍微麻烦点
二月十六 2017-03-23
  • 打赏
  • 举报
回复
select dt,(SELECT COUNT(DISTINCT uid) from (select t1.uid,t2.dt,COUNT(1) as 人数 from (SELECT *  from(
select uid,dt,COUNT(DISTINCT uid) as 人数
from recharge GROUP BY uid,dt)t
)t1 join (select DISTINCT dt from recharge)t2 on t1.dt<=t2.dt
GROUP BY t1.uid,t2.dt)t4 where t4.dt = t3.dt and t4.人数=2) as 人数 from (select DISTINCT dt from recharge)t3



56,679

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧