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

У меня есть простой запрос, который я хотел бы отобразить за последние 7 дней, сгруппированные по часам из таблицы apiRequest: Количество запросов, имеющих транзакцию, против количества тех, у которых нет транзакции.

Я пробовал два разных подхода, но оба не удалось.Первый столбец отображается нормально, второй проблемный:

+--------------+-------------+--------------------+-----------------+
| Date         | Time        | Total Requests     | no trans.       |
+--------------+-------------+--------------------+-----------------+
| January 20th | 2:00-3:00   |                 44 |               0 |
| January 20th | 3:00-4:00   |                 32 |               0 |
| January 20th | 5:00-6:00   |                 51 |               0 |
| January 20th | 6:00-7:00   |                 18 |               0 |

Первый подход был с подзапросом, который почти работал, но я не смог заставить WHERE accountDetails NOT LIKE "%Transactions\":[{%" работать.

Второй запрос был с inner join, но ему не удалось заставить группу работать так, как ожидалось для второго столбца.

--  Two column table that displays number of requests for past seven days, grouped by hour of the day
-- First try, with subquery - the second column does not show result


--  Col 1 - Shows count of requests with transactions, 
--  Col 2 - count of requests without transactions
--  for every hour of the day in past seven days
SELECT DATE_FORMAT(a.created, "%M %D") Date,
       CONCAT(HOUR(a.created), ':00-', HOUR(a.created)+1, ':00') Time,
       count(a.`RequestId`) as "Total Requests",
         (select count(a2.`RequestId`) FROM apiRequest a2 WHERE DATE_FORMAT(f.created,"%Y %M %D %H") = DATE_FORMAT(a2.created, "%M %D %H")) "IBV's no trans."
        FROM apiRequest a
   WHERE a.created >= CURDATE() - INTERVAL 7 day
     AND a.RequestId IS NOT NULL 
GROUP BY DATE_FORMAT(a.created, "%M %D %H");


-- Second try, with inner join - group by does not work
SELECT DATE_FORMAT(a.created, "%M %D"),
       CONCAT(HOUR(a.created), ':00-', HOUR(f.created)+1, ':00') AS Hours,
       count(a.`RequestId`) as "Total requests",
       f2.ibvsNoTrans
        FROM apiRequest a
        INNER JOIN (SELECT COUNT(RequestId) ApiNoTrans FROM ApiRequest WHERE accountDetails NOT LIKE "%Transactions\":[{%" GROUP BY date_format(apiRequest.created, "%Y %M")) f2
           WHERE a.created >= CURDATE() - INTERVAL 7 day
     AND a.RequestId IS NOT NULL 
GROUP BY YEAR(a.created), MONTH(a.created), DAY(a.created), HOUR(a.created), Hours;

Я совершенно уверен, что я близок к цели, но упускаю детали.Мне кажется, это должно быть проще, каков правильный подход, и есть ли более оптимальный способ сопоставления по датам / часам, чем у меня?

1 Ответ

0 голосов
/ 27 января 2019

Является ли условная агрегация тем, что вы ищете?

SELECT DATE_FORMAT(a.created, '%M %D') as Date,
       CONCAT(HOUR(a.created), ':00-', HOUR(a.created)+1, ':00') as Time,
       SUM(a.RequestId IS NULL) as Valid_Requests,
       SUM(a.RequestId IS NOT NULL) as Invalid_Requests
FROM apiRequest a
WHERE a.created >= CURDATE() - INTERVAL 7 day
GROUP BY DATE_FORMAT(a.created, '%M %D'), HOUR(a.created);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...