Вот таблица event_temperature
, запись - это запись температуры сотрудника в определенное время:
event_id, dept_name, event_card, temp, event_time
9394cf697afa11ea9562040e3c15002f, BU003, F9011101, 36.7000, 2020-04-08 06:50:01
9394cecc7afa11ea9562040e3c15002f, BU003, F9011101, 37.2000, 2020-04-11 07:50:17
907ebe3f7afa11ea9562040e3c15002f, BU003, W4204094, 40.3000, 2020-04-10 08:35:45
8fdf42a07afa11ea9562040e3c15002f, BU007, F1644194, 36.1600, 2020-04-07 19:58:08
8e9bb6fd7afa11ea9562040e3c15002f, BU003, F2150829, 35.8000, 2020-04-11 12:45:23
Теперь я хочу получить количество этих 3 типов сотрудников в каждом отделе. за сегодня:
- всего: вся температура
- ненормально: температура между 37,3 и 42
- подозреваемо: температура между 36,5 и 37,3
Я написал это SQL, но выглядит по-разному:
SELECT
ee1.dept_name, ee1.total, ee2.abnormal, ee3.suspect
FROM
(SELECT
ee.dept_name, COUNT(DISTINCT ee.event_card) AS total
FROM
(SELECT DISTINCT
et.dept_name,
et.event_card,
CASE
WHEN et.temp BETWEEN 36.5 AND 37.3 THEN 'suspect'
WHEN et.temp BETWEEN 37.3 AND 42 THEN 'abnormal'
ELSE 'normal'
END AS type_
FROM
`whsgdb-dev`.event_temperature et
WHERE
et.event_time BETWEEN '2020-04-11 00:00:00' AND '2020-04-11 23:59:59') ee
GROUP BY ee.dept_name) ee1
LEFT JOIN
(SELECT
ee.dept_name, COUNT(DISTINCT ee.event_card) AS abnormal
FROM
(SELECT DISTINCT
et.dept_name,
et.event_card,
CASE
WHEN et.temp BETWEEN 36.5 AND 37.3 THEN 'suspect'
WHEN et.temp BETWEEN 37.3 AND 42 THEN 'abnormal'
ELSE 'normal'
END AS type_
FROM
`whsgdb-dev`.event_temperature et
WHERE
et.event_time BETWEEN '2020-04-11 00:00:00' AND '2020-04-11 23:59:59') ee
WHERE
ee.type_ = 'abnormal'
GROUP BY ee.dept_name) ee2 ON ee2.dept_name = ee1.dept_name
LEFT JOIN
(SELECT
ee.dept_name, COUNT(DISTINCT ee.event_card) AS suspect
FROM
(SELECT DISTINCT
et.dept_name,
et.event_card,
CASE
WHEN et.temp BETWEEN 36.5 AND 37.3 THEN 'suspect'
WHEN et.temp BETWEEN 37.3 AND 42 THEN 'abnormal'
ELSE 'normal'
END AS type_
FROM
`whsgdb-dev`.event_temperature et
WHERE
et.event_time BETWEEN '2020-04-11 00:00:00' AND '2020-04-11 23:59:59') ee
WHERE
ee.type_ = 'suspect'
GROUP BY ee.dept_name) ee3 ON ee3.dept_name = ee1.dept_name
Результат:
dept_name, total, abnormal, suspect
BU003, 3227, null, 6
BU007, 247, null, 2
BU011, 16, null, 1
Пожалуйста, помогите мне упростить оператор sql, или есть более простой способ