【问题标题】:Grouping by X days按 X 天分组
【发布时间】:2010-07-24 12:11:37
【问题描述】:

我有一个数据库,可以显示关于不同活动的不同统计信息,每一行都有一个时间戳值名称“日期”。

我编写了用于选择和汇总日期范围的代码,例如:21-24/07/2010。 现在我需要添加一个选项来选择日期范围,还要对每 X 天的统计数据进行分组。

假设用户选择查看整个月的统计数据:01/07-31/07。我想向他展示按 X 天分组的统计数据,比如说 3,所以他会看到 01-03/07、04-06/07、07-09/07 等统计数据...

我几乎用这段代码做到了:

SELECT t1.camp_id,from_days( floor( to_days( date ) /3 ) *3 ) AS 'first_date'
FROM facebook_stats t1
INNER JOIN facebook_to_campaigns t2 ON t1.camp_id = t2.facebook_camp_id
WHERE date
BETWEEN 20100717000000
AND 20100724235959
GROUP BY from_days( floor( to_days( date ) /3 ) *3 ) , t2.camp_id

它实际上确实将它分组(按 3 天),但问题是由于某种原因它从 16/07 而不是 17/07 开始,然后每次分组 3 天。

希望听到代码的解决方案或我给出的您想到的更好的解决方案。

【问题讨论】:

    标签: mysql group-by statistics


    【解决方案1】:

    To_Days 返回自 0 年以来的天数。当您将其除以 3 时,它只考虑商而不考虑余数。例如。如果距离第 0 年已有 5 天,则 to_days 将返回 1。

    To_days(20100717000000) 的余数必须为 1。基本上 To_days(20100716000000) 可以被 3 整除,但 17th 不能。

    你可以试试这个查询:

    DECLARE @startDate datetime
    DECLARE @endDate datetime
    DECLARE @groupByInterval INT
    SET @startdate = 20100717000000
    SET @enddate = 20100724235959
    SET @groupByInterval = 3
    
    SELECT 
    t1.camp_id,   from_days(
    to_days(@startDate)+floor(
    (to_days(date)-to_days(@startDate))/@groupByInterval
    )
    * @groupByInterval) 
    AS first_date
    FROM facebook_stats t1
    INNER JOIN facebook_to_campaigns t2 ON t1.camp_id = t2.facebook_camp_id
    WHERE date
    BETWEEN @startDate
    AND @endDate
    GROUP BY first_date , t2.camp_id
    

    【讨论】:

    • 编辑添加一个可能的解决方案
    • P.S:我主要是 MS SQL 人,所以 MySQL 的语法可能在某些地方是错误的。
    • 我不知道在mysql中声明,你能解释一下它的作用吗?它像设置变量吗?我给出了一个带有日期的具体示例,但它们是动态的,我可以编写查询以便它通过我传递给它的参数进行更改吗?
    • 是的,声明就像在标准 SQL 中设置 vars。我不确定mysql中的确切语法。你可以尝试用谷歌搜索它。是的,您只需要在 SET 语句中更改 @startDate 和 @endDate 的值,它应该像参数一样工作。您甚至可以更改间隔。
    • 嘿,所以重要的是实际上是 first_date 的: from_days( to_days( 20100717000000 ) + floor( ( to_days( date ) - to_days( 20100717000000 ) ) /3 ) *3 这就是你的意思我应该怎么做?
    猜你喜欢
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 2012-04-26
    • 2021-12-23
    • 1970-01-01
    相关资源
    最近更新 更多