sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Por qué el resultado de COUNT es el doble cuando hago una combinación de dos?

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").