У меня есть следующий SQL, который в основном работает.Как бы я представлял это в Django ORM?Я хотел бы избежать запуска полного необработанного запроса
Я не уверен, что делать с подзапросом в Django ORM и как правильно выполнить декартово произведение (достигается с помощью CROSS JOIN)
SELECT datum,
alldata.worker_id,
reporting_plan.project_id,
SUM(effort::float)/60/60
FROM
(SELECT DISTINCT datum,
reporting_plan.worker_id AS worker_id
FROM
(SELECT datum::date
FROM generate_series('2019-05-01', '2019-12-31', '1 day'::interval) datum) AS dates
CROSS JOIN reporting_plan
ORDER BY datum,
worker_id) AS alldata
LEFT OUTER JOIN reporting_plan ON alldata.worker_id = reporting_plan.worker_id
AND datum <= reporting_plan.end
AND datum >= reporting_plan.start
GROUP BY datum,
alldata.worker_id,
reporting_plan.worker_id,
reporting_plan.project_id
ORDER BY datum,
alldata.worker_id,
reporting_plan.worker_id,
reporting_plan.project_id
Ожидаемый результат - это список со всеми датами на таймфрейме и всеми работниками и соответствующей информацией планирования (проекты и усилия).
Спасибо!
РЕДАКТИРОВАТЬ :
Основываясь на отзывах @jimjimjim, мне удалось удалить CROSS JOIN, но получить те же результаты:
SELECT datum::date,
alldata.worker_id,
reporting_plan.project_id,
SUM(effort::float)/60/60
FROM
(SELECT DISTINCT generate_series ('2019-05-01', '2019-12-31', '1 day'::interval) AS datum,
worker_id
FROM reporting_plan
ORDER BY datum,
worker_id) AS alldata
LEFT OUTER JOIN reporting_plan ON alldata.worker_id = reporting_plan.worker_id
AND datum <= reporting_plan.end
AND datum >= reporting_plan.start
GROUP BY datum,
alldata.worker_id,
reporting_plan.worker_id,
reporting_plan.project_id
ORDER BY datum,
alldata.worker_id,
reporting_plan.project_id