计算用户的困难查询出现在某些日子之前

时间:2017-08-10 22:05:36

标签: mysql sql database

我有一张桌子

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技能:) 我知道基本选择,分组条款,但我只是想知道是否有任何我应该了解的高级技术。

任何帮助将不胜感激

4 个答案:

答案 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)

我只是想帮助你假设我对你的问题的理解

仅来自documentation

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