sql >> Database >  >> RDS >> Mysql

MySQL-groep per uur

Uw bestaande zoekopdracht kan worden teruggebracht tot:

SELECT   CONCAT(HOUR(created), ':00-', HOUR(created)+1, ':00') AS Hours
  ,      COUNT(*) AS `usage`
FROM     history
WHERE    created BETWEEN '2012-02-07' AND NOW()
GROUP BY HOUR(created)

Om elke weer te geven uur, inclusief de uren waarvoor geen gegevens zijn, moet u outer joinen met een tabel met alle uren waarvoor u gegevens wilt. U kunt zo'n tabel in uw zoekopdracht bouwen met UNION :

SELECT   CONCAT(Hour, ':00-', Hour+1, ':00') AS Hours
  ,      COUNT(created) AS `usage`
FROM     history
  RIGHT JOIN (
                   SELECT  0 AS Hour
         UNION ALL SELECT  1 UNION ALL SELECT  2 UNION ALL SELECT  3
         UNION ALL SELECT  4 UNION ALL SELECT  5 UNION ALL SELECT  6
         UNION ALL SELECT  7 UNION ALL SELECT  8 UNION ALL SELECT  9
         UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12
         UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL SELECT 15
         UNION ALL SELECT 16 UNION ALL SELECT 17 UNION ALL SELECT 18
         UNION ALL SELECT 19 UNION ALL SELECT 20 UNION ALL SELECT 21
         UNION ALL SELECT 22 UNION ALL SELECT 23
  )      AS AllHours ON HOUR(created) = Hour
WHERE    created BETWEEN '2012-02-07' AND NOW() OR created IS NULL
GROUP BY Hour
ORDER BY Hour

De behandeling van groepen waarvoor geen gegevens bestaan, is echter een kwestie van bedrijfslogica die het best in uw gegevenstoegangslaag kan worden geplaatst in plaats van in de database zelf:het zou inderdaad triviaal moeten zijn voor uw toepassing om een ​​nulwaarde te gebruiken wanneer een uur afwezig.



  1. Hoe MySQL 8.0 te installeren op RHEL/CentOS 8/7 en Fedora 35

  2. Leer:OP DUBBELE SLEUTEL-UPDATE

  3. Oracle selecteert meest recente datumrecord

  4. Topvragen over primaire sleutel in Oracle met voorbeelden