PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Por que o resultado de COUNT é duplo quando eu faço dois joins?


Isso é muito simples de responder. Você tem dois record e dois alarm . Você junta estes e obtém quatro registros, que você conta.

Você pode solucionar esse problema contando IDs distintos:
COUNT(DISTINCT records.id) AS "last24HMessagesCount",
COUNT(DISTINCT alarms.id) AS "activeAlarmsCount"

mas eu não recomendaria isso. Por que você participa do record e alarm de qualquer forma? Eles não estão diretamente relacionados. O que você quer para participar é o número de record e o número de alarm . Portanto, agregue antes de ingressar:
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;

(Removi a junção desnecessária à tabela "grupo".)