Как мне посчитать количество записей и сгруппировать по дате каждые 7 дней SQL - PullRequest
0 голосов
/ 08 апреля 2019

Я пытаюсь написать запрос, который подсчитывает количество записей, созданных каждые 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

Спасибо за любой совет

Ответы [ 2 ]

1 голос
/ 08 апреля 2019

Если вы не слишком требовательны к своим граничным условиям для начала определенной недели, вы можете просто агрегировать, используя 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);

См. Здесь для нескольких способов создания таблицы календаря, подобной той, которая использовалась выше во втором запросе.

0 голосов
/ 08 апреля 2019

Один метод использует 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...