Упростите оператор SQL - PullRequest
       2

Упростите оператор SQL

0 голосов
/ 11 апреля 2020

Вот таблица 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 типов сотрудников в каждом отделе. за сегодня:

  1. всего: вся температура
  2. ненормально: температура между 37,3 и 42
  3. подозреваемо: температура между 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, или есть более простой способ

1 Ответ

2 голосов
/ 11 апреля 2020

Использовать условную агрегацию:

SELECT
    dept_name,
    COUNT(DISTINCT event_card) AS total,
    COUNT(DISTINCT CASE WHEN temp BETWEEN 37.3 AND 42   THEN event_card END) AS abnormal,
    COUNT(DISTINCT CASE WHEN temp BETWEEN 36.5 AND 37.3 THEN event_card END) AS suspect
FROM event_temperature
WHERE
    event_time >= CURDATE() && event_time < (CURDATE() + INTERVAL 1 DAY)
GROUP BY
    dept_name
ORDER BY
    dept_name;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...