У меня есть запрос, который в настоящее время работает, но основанный на нем неэффективен.В основном я пытаюсь сгруппировать данные по труду и продажам по часам.
И я хочу сделать это, задавая запрос в день.
Я использую PostgreSQL.
У меня есть куча записей о временных ударах, которые имеют employee_id
, job_id
и location_id
, но если сотрудник включился и не закрылся, я должен проверить поле clock_out_time и установить*
Время планирования: 0.509 мс
Время выполнения: 0.498 мс
Я делаюэто с 30-50 записями, поэтому это не будет масштабироваться.
Что я могу сделать, чтобы улучшить это?
SELECT
date_trunc('hour', tp.clock_in_time) AS hour,
SUM(
(
EXTRACT (DAY FROM (CASE WHEN EXTRACT(YEAR FROM tp.clock_out_time) = -1 THEN now() ELSE tp.clock_out_time END - tp.clock_in_time))*24*60*60+
EXTRACT (HOUR FROM (CASE WHEN EXTRACT(YEAR FROM tp.clock_out_time) = -1 THEN now() ELSE tp.clock_out_time END - tp.clock_in_time))*60*60+
EXTRACT (MINUTE FROM (CASE WHEN EXTRACT(YEAR FROM tp.clock_out_time) = -1 THEN now() ELSE tp.clock_out_time END - tp.clock_in_time))*60+
EXTRACT (SECOND FROM (CASE WHEN EXTRACT(YEAR FROM tp.clock_out_time) = -1 THEN now() ELSE tp.clock_out_time END - tp.clock_in_time))
) / 60 / 60.00 * (job.rate / 100.00)
) AS labor_costs,
(
SELECT
SUM(total) / 100.00
FROM
ticket
WHERE
open=false
AND
DATE_TRUNC('day', opened_at) = date_trunc('day', '2018-12-22T11:15:05-05:00'::date)
AND
DATE_TRUNC('day', closed_at) = date_trunc('day', '2018-12-22T11:15:05-05:00'::date)
GROUP BY date_trunc('hour', opened_at)
ORDER BY date_trunc('hour', opened_at)
) AS hourly_sales
FROM
employee_time_punch as tp
INNER JOIN
employee
ON
employee.id = tp.employee_id
INNER JOIN
employee_job as job
ON
job.id = tp.job_id
WHERE
DATE_TRUNC('day', tp.clock_in_time) = DATE_TRUNC('day', '2006-01-02T11:15:05-05:00'::date)
AND
DATE_TRUNC('day', CASE WHEN EXTRACT(YEAR FROM tp.clock_out_time) = -1 THEN now() ELSE tp.clock_out_time END) = DATE_TRUNC('day', '2006-01-02T11:15:05-05:00'::date)
GROUP BY 1
ORDER BY 1;