Я манипулирую длинный, очень запрошенный стол (> 500 миллионов записей), поэтому очень важно избегать больших запросов.Избегайте нескольких подзапросов
В настоящее время мне нужно получить некоторые значения с условием (объясним лучше в одно мгновение), а затем проверить, находятся ли эти значения в другой группе значений (все это относится к одному полю). Я создаю представление таблицы, используя with
.
Итак, вот синтаксис таблицы: (таблица сотрудников)
+--------+-------------+-----------+--------+---------+-----------+
| period | employee_id | operation | sub_op | payment | work_zone |
+--------+-------------+-----------+--------+---------+-----------+
Периоды имеют этот формат «YYMM», один период относится к одному месяцу.
Конечно, таблица намного длиннее, чем этот образец, но мне нужны только те поля в запросе. Краткое объяснение того, что мне нужно, а затем сам запрос.
мне нужно, чтобы получить все employee_id
в текущем period
, со значительным payment
(по крайней мере, $ 250) и определенной operation
(первой I группы, значение operations
с sub_op
). Требуемое значение operation
равно 97, и в запросе вы увидите, как я его группирую.
Теперь к этим значениям я группирую их по work_zone
и сгруппированным значениям operation
. И теперь начинаются подзапросы ... Мне нужно:
- Все значения, которые не были в прошлом периоде.
- Все значения, которые не были в последние 36 периодов (3 года).
- Все значения, которые были по меньшей мере в одном из последних 36 периодов.
- Все значения, которые были по меньшей мере в одном из последних 36 периодов, но с другой операцией.
- Все значения, которые были по крайней мере в одном из последних 36 периодов, но с платежом ниже 250 долларов США.
Итак, вот запрос, который у меня до сих пор. (Я использую в период «1109»)
CREATE OR REPLACE VIEW hired_fired AS
WITH query_hired_fired AS (
SELECT work_zone, operation, sub_op, employee_id,
CASE
WHEN operation = 97 THEN
CASE
WHEN sub_op IN (1,3,5) THEN 'Cookers'
WHEN sub_op IN (2,6) THEN 'Waitress'
WHEN sub_op IN (4,7,8,9,10) THEN 'Cashier'
WHEN sub_op = 11 THEN 'Security'
WHEN sub_op IN (12,13) THEN 'Cleaners'
ELSE 'Others'
END
END AS opgroup
FROM employee
WHERE period = 1109 AND payment >= 250 AND operation = 97
)
SELECT 201109 AS periodo, opgroup, work_zone
(SELECT COUNT(DISTINCT employee_id) FROM query_hired_fired WHERE employee_id NOT IN (SELECT employee_id FROM employee WHERE period = 1108 AND payment >= 250 AND operation = 97)) AS total,
(SELECT COUNT(DISTINCT employee_id) FROM query_hired_fired WHERE employee_id NOT IN (SELECT employee_id FROM employee WHERE period BETWEEN 0808 AND 1108 AND payment >= 250 AND operation = 97)) AS absolut,
(SELECT COUNT(DISTINCT employee_id) FROM query_hired_fired WHERE employee_id IN (SELECT employee_id FROM employee WHERE period BETWEEN 0808 AND 1108 AND payment >= 250 AND operation = 97)) AS reincorporated,
(SELECT COUNT(DISTINCT employee_id) FROM query_hired_fired WHERE employee_id IN (SELECT employee_id FROM employee WHERE period BETWEEN 0808 AND 1108 AND payment >= 250 AND operation != 97)) AS operation_change,
(SELECT COUNT(DISTINCT employee_id) FROM query_hired_fired WHERE employee_id IN (SELECT employee_id FROM employee WHERE period BETWEEN 0808 AND 1108 AND payment < 250 AND operation = 97)) AS raised,
FROM query_hired_fired
GROUP BY work_zone, opgroup
Итак, мой вопрос ... Есть ли в любом случае я могу сделать этот запрос без всех подзапросов? Я думаю, для этого потребуется несколько часов, и это не похоже на работу с этой таблицей.
Извините, если я что-то не понял, я буду как можно скорее ответить на все вопросы и замечания. Благодарю.
Спасибо за исправление, уже отредактированное в вопросе. Спасибо за ответ также – AleOtero93