我有一张桌子
id, date
a , 2017-01-01
a , 2017-01-02
b , 2017-02-03
...
并且我想计算每天D,有多少不同的用户在7天前(当天)出现,但不是在D-7和D之间。不要关心如果他们出现在D日之前
输出应为
date, count
2017-01-01, 23
2017-01-02, 33
等
我已经考虑了很长一段时间,但无法弄清楚D到D + 7的部分。很容易转换成python,但我想提高我的SQL技能:) 我知道基本选择,分组条款,但我只是想知道是否有任何我应该了解的高级技术。
任何帮助将不胜感激
答案 0 :(得分:0)
您可以检查用户是否在当天和7天前出现
SELECT DDate,
COUNT(*) cnt
FROM tablename a
WHERE id IN (SELECT id
FROM tablename
WHERE DDate = DATE_SUB(a.DDate, INTERVAL 7 DAY)
)
GROUP BY DDate
答案 1 :(得分:0)
我只是想帮助你假设我对你的问题的理解
select count(date), date from tablename where date<=CURDATE() + interval 7 day group by date
答案 2 :(得分:0)
您可以在将来的7天内在同一桌面上使用左联接,以查看该ID是否显示。如果它没有显示,则左连接表的id将为null。
select count(distinct t1.id), t1.date + interval 7 day
from table t1
left join table t2 on t2.id = t1.id and t2.date < t1.date + interval 7 day and t2.date >= t1.date
where t2.id is null;
答案 3 :(得分:0)
与Ferdinand Gasper的回答类似,但这不包括在不到7天前出现的用户:
SELECT date, COUNT(DISTINCT id)
FROM yourTable AS t1
WHERE id IN (SELECT id
FROM yourTable AS t2
WHERE t2.date = DATE_SUB(t1.date, INTERVAL 7 DAY))
AND id NOT IN (SELECT id
FROM yourTable AS t2
WHERE t2.date BETWEEN DATE_SUB(t1.date, INTERVAL 6 DAY) AND DATE_SUB(t1.date, INTERVAL 1 DAY))
GROUP BY date