繁体   English   中英

如何每7天计算记录数和按日期分组SQL

[英]How do i count number of records and group by date every 7 days SQL

我正在尝试编写一个查询,该查询计算每7天创建的记录数,使用此查询,我可以获得每天创建的记录数,

SELECT 'Closed' AS `Status`, COUNT(*) AS `Count`, `raisedon` AS `Date` FROM table WHERE raisedon >= '2019-01-01' and raisedon < '2019-03-29' AND status = 'Open' AND type = 'A' AND location = 'B' AND locationid = 'C' GROUP BY raisedon

这返回

Closed 1 2019-01-01
Closed 1 2019-01-14
Closed 2 2019-01-16
Closed 1 2019-01-24
Closed 1 2019-01-25
Closed 1 2019-01-30
Closed 1 2019-02-01
Closed 1 2019-02-03
Closed 1 2019-02-28
Closed 1 2019-03-07
Closed 1 2019-03-08

我希望结果像

Closed 1 2019-01-01
Closed 1 2019-01-08
Closed 2 2019-01-15
Closed 2 2019-01-22
Closed 3 2019-01-29
Closed 0 2019-02-05
Closed 0 2019-02-12
Closed 0 2019-02-19
Closed 1 2019-02-26
Closed 2 2019-03-05

这可能只是查询还是我也必须使用javascript,我将phpmyadmin与mysql一起使用

感谢您的任何建议

如果您对给定一周开始的边缘条件不太挑剔,则可以使用YEARWEEK进行汇总:

SELECT
    'Closed' AS Status,
    COUNT(*) AS cnt,
    YEARWEEK(raisedon) AS week
FROM yourTable
WHERE
    raisedon >= '2019-01-01' AND raisedon < '2019-03-29' AND
    status = 'Open' AND
    type = 'A' AND
    location = 'B' AND
    locationid = 'C'
GROUP BY
    YEARWEEK(raisedon);

该答案假设您的数据每周至少有一个数据点。 如果可能存在很大的差距,那么一种解决方案是将日历表加入其中。 这是如何执行此操作的示例:

SELECT
    'Closed' AS Status,
    COUNT(t2.raisedon) AS cnt,
    YEARWEEK(t1.raisedon) AS week
FROM
(
    SELECT '2019-01-01' AS raisedon UNION ALL
    SELECT '2019-01-02' UNION ALL
    SELECT '2019-01-03' UNION ALL
    ...
    SELECT '2019-01-31' UNION ALL
    SELECT '2019-02-01' UNION ALL
    ...
    SELECT '2019-03-31'
) t1
LEFT JOIN yourTable t2
    ON t1.raisedon = t2.raisedon
WHERE
    t1.raisedon >= '2019-01-01' AND t1.raisedon < '2019-03-29' AND
    t2.status = 'Open' AND
    t2.type = 'A' AND
    t2.location = 'B' AND
    t2.locationid = 'C'
GROUP BY
    YEARWEEK(t1.raisedon);

请参阅此处 ,以了解生成日历表的几种方法,例如上面第二个查询中使用的方法。

一种方法使用datediff()

SELECT 'Closed' AS `Status`,
       COUNT(*) AS `Count`,
       MIN(raisedon) AS `Date`
FROM table
WHERE raisedon >= '2019-01-01' AND
      raisedon < '2019-03-29' AND
      status = 'Open' AND
      type = 'A' AND
      location = 'B' AND
      locationid = 'C'
GROUP BY FLOOR(DATEDIFF('2019-01-01', raisedon) / 7);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM