【问题标题】:MySQL group by 7 days for current quarterMySQL 本季度按 7 天分组
【发布时间】:2016-12-07 07:57:09
【问题描述】:

请说明如何在不使用嵌套查询的情况下对当前季度按 7 天分组。 应该是这样的:

Week_period Date                      Clicks

1           1-10-2016 To 07-10-2016   30
2           8-10-2016 To 14-10-2016   40
3           15-10-2016 To 28-10-2016   20
4           29-10-2016 To 04-11-2016   10
5           05-11-2016 To 11-11-2016   80
6           12-11-2016 To 18-11-2016   90

并将持续到 2016 年 12 月 31 日

CREATE TABLE IF NOT EXISTS `user_click` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `date` datetime NOT NULL
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

感谢您的帮助。我修改了如下代码:

SELECT STR_TO_DATE(CONCAT(YEARWEEK(`date`), ' Sunday'), '%X%V %W')   week_start, 
       STR_TO_DATE(CONCAT(YEARWEEK(`date`), ' Saturday'), '%X%V %W') week_end, 
       SUM(id) clicks 
FROM   `user_click`  where QUARTER(`date`) = QUARTER(CURRENT_DATE())
GROUP  BY YEARWEEK(`date`) 

但它也给出了 9 月的日期,这是不正确的。目前我得到的输出为:

 week_start     week_end    clicks  
2016-09-25  2016-10-01  1
2016-10-02  2016-10-08  70

但所需的结果不匹配,因为我想要的结果取决于天,即 10 月 1 日至 10 月 7 日,如前所述。请帮助解决这方面的问题

【问题讨论】:

标签: mysql


【解决方案1】:

我会尝试按YEARWEEK(date) 进行分组,如下所示:

  SELECT YEARWEEK("date"), count("id")
    FROM "user_click"
GROUP BY YEARWEEK("date");

您可能需要稍微调整一下输出,但这应该可以解决问题。

【讨论】:

    【解决方案2】:

    您可以使用YEARWEEK 对7 天进行分组,此外,您可以使用STR_TO_DATE 来获取一周的开始和结束。您可能还需要汇总点击次数

    SELECT STR_TO_DATE(CONCAT(YEARWEEK(`date`), ' Sunday'), '%X%V %W')   week_start, 
           STR_TO_DATE(CONCAT(YEARWEEK(`date`), ' Saturday'), '%X%V %W') week_end, 
           SUM(clicks) clicks 
    FROM   `user_click` 
    WHERE  `date` BETWEEN '2016-10-01' AND '2016-12-31' 
    GROUP  BY YEARWEEK(`date`) 
    

    【讨论】:

    【解决方案3】:

    我用下面的查询解决了同样的问题。感谢您的宝贵时间。

    SELECT 1 + DATEDIFF(date, MAKEDATE(YEAR(CURDATE()), 1) + INTERVAL QUARTER(CURDATE()) QUARTER - INTERVAL    1 QUARTER) DIV 7  AS weekNumber, MAKEDATE(YEAR(CURDATE()), 1) + INTERVAL QUARTER(CURDATE()) QUARTER - INTERVAL    1 QUARTER + INTERVAL (DATEDIFF(date, MAKEDATE(YEAR(CURDATE()), 1) + INTERVAL QUARTER(CURDATE()) QUARTER - INTERVAL    1 QUARTER) DIV 7) WEEK AS week_start_date, count(id)
        FROM 
            user_click 
        WHERE 
            QUARTER(date) = QUARTER(CURRENT_DATE()) AND date >= (MAKEDATE(YEAR(CURDATE()), 1) + INTERVAL QUARTER(CURDATE()) QUARTER - INTERVAL 1 QUARTER)
        GROUP BY
            DATEDIFF(date, MAKEDATE(YEAR(CURDATE()), 1) + INTERVAL QUARTER(CURDATE()) QUARTER - INTERVAL 1 QUARTER) DIV 7 ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多