Esto es muy simple de responder. Tienes dos record
y dos alarm
. Te unes a estos y obtienes cuatro registros, que cuentas.
Puede solucionar este problema contando ID distintos:
COUNT(DISTINCT records.id) AS "last24HMessagesCount",
COUNT(DISTINCT alarms.id) AS "activeAlarmsCount"
pero yo no recomendaría esto. ¿Por qué te unes a record
? y alarm
¿de todos modos? No están directamente relacionados. Lo que quieres unirse es el número de record
y el número de alarm
. Así que agrega antes de unirte:
SELECT
device.id,
device.name,
records.cnt AS "last24HMessagesCount",
alarms.cnt AS "activeAlarmsCount"
FROM device
LEFT OUTER JOIN
(
SELECT deviceId, count(*) AS cnt
FROM record
WHERE "date" > '2017-07-12 11:43:02.838 +00:00'
GROUP BY deviceId
) AS records ON device.id = records.deviceId
LEFT OUTER JOIN
(
SELECT deviceId, count(*) AS cnt
FROM alarm
WHERE status = 'new'
GROUP BY deviceId
) AS alarms ON device.id = alarms.deviceId
WHERE device.serviceId = 1832
AND device.groupId = 205;
(He eliminado la unión innecesaria a la tabla "grupo").