Mysql SQL如何在不断变化的时间范围内计算不同的id

Mysql SQL如何在不断变化的时间范围内计算不同的id,mysql,sql,count,pivot,date-arithmetic,Mysql,Sql,Count,Pivot,Date Arithmetic,我想计算从今天到昨天,从今天到3天前,从今天到5天前,从今天到7天前,从今天到15天前,从今天到30天前这段时间内fd_id的明显数量 我的数据表如下所示: user_id. fd_id. date 1. 123a. 20201010 1. 123a. 20201011 1. 124a. 20201011 ... 所需结果的格式如下: user_id count_fd_i

我想计算从今天到昨天,从今天到3天前,从今天到5天前,从今天到7天前,从今天到15天前,从今天到30天前这段时间内fd_id的明显数量

我的数据表如下所示:

     user_id.  fd_id.  date
      1.        123a.  20201010
      1.        123a.  20201011
      1.        124a.  20201011
      ...
所需结果的格式如下:

    user_id    count_fd_id_1d  count_fd_id_3d ... count_fd_id_30d
具体来说,我知道我可以执行以下6次操作,并通过某种列绑定方法将它们连接在一起:

select user_id, count(distinct fd_id) as count_fd_id_1d
from table 
where date <= today and date >= today-1 (#change this part for different dates)

select user_id, count(distinct fd_id) as count_fd_id_3d
from table 
where date <= today and date >= today-3 (#change this part for different dates)
...

我想知道如何在不运行6次几乎相同的代码的情况下一次完成此操作。

您可以使用条件聚合:

select user_id,
    count(distinct case when date >= current_date - 1 day and date < current_date then fd_id end) as cnt_1d,
    count(distinct case when date >= current_date - 3 day and date < current_date then fd_id end) as cnt_3d,
    ...
from mytable
goup by user_id
您可以使用日期表达式来设置所需的范围。以上内容适用于整天,不包括当天。

如果表中的日期列确实不是日期/日期时间格式,我认为您需要使用STR_to_date将其转换为日期格式,然后使用DATEDIFF检查日期差异。考虑这个示例查询:

SELECT user_id, 
       MAX(CASE WHEN ddiff=1 THEN cn END) AS count_fd_id_1d,
       MAX(CASE WHEN ddiff=2 THEN cn END) AS count_fd_id_2d,
       MAX(CASE WHEN ddiff=3 THEN cn END) AS count_fd_id_3d,
       MAX(CASE WHEN ddiff=4 THEN cn END) AS count_fd_id_4d,
       MAX(CASE WHEN ddiff=5 THEN cn END) AS count_fd_id_5d
FROM (SELECT user_id, 
             DATEDIFF(CURDATE(), STR_TO_DATE(DATE,'%Y%m%d')) ddiff, 
             COUNT(DISTINCT fd_id) cn
      FROM mytable
      GROUP BY user_id, ddiff) A
GROUP BY user_id;
目前,如果您仅使用直接减法检查日期值,您将得到不正确的结果。例如:

*your current date value - how many days:
'20201220' - 30 = '20201190' <-- this is not correct.

*if you convert the date value and using the same subtraction:
STR_TO_DATE('20201220','%Y%m%d') - 30 = '20201190' <-- still get incorrect.

*convert date value then uses INTERVAL for the date subtraction:
STR_TO_DATE('20201220','%Y%m%d') - INTERVAL 30 DAY = '2020-11-20'
OR
DATE_SUB(STR_TO_DATE('20201220','%Y%m%d'),INTERVAL 30 DAY) = '2020-11-20'

*IF your date column is storing standard date format value, then omit STR_TO_DATE
'2020-12-20' - INTERVAL 30 DAY = '2020-11-20'
OR
DATE_SUB('2020-12-20',INTERVAL 30 DAY) = '2020-11-20'
查看更多


对于这个问题,通过一系列测试。

那么,date列没有存储标准的日期格式?我的意思是列数据类型不是DATE或DATETIME?