Python 将SQL转换为Django ORM查询(“如果”语句位于“窗口”内、“引导”函数内)
我正在尝试获取下一个开始使用服务的客户的日期,并将该日期附加到前一个客户 我试图了解F()和Q()以及类似SQL的函数在Django中的工作方式,但无法了解如何将以下SQL语句转换为有效的Django代码:Python 将SQL转换为Django ORM查询(“如果”语句位于“窗口”内、“引导”函数内),python,sql,django,Python,Sql,Django,我正在尝试获取下一个开始使用服务的客户的日期,并将该日期附加到前一个客户 我试图了解F()和Q()以及类似SQL的函数在Django中的工作方式,但无法了解如何将以下SQL语句转换为有效的Django代码: SELECT *, LEAD( IF(actual_start IS NOT NULL, actual_start, planned_start) , 1)
SELECT
*,
LEAD(
IF(actual_start IS NOT NULL, actual_start, planned_start)
, 1)
OVER(
PARTITION BY customer
ORDER BY actual_start, planned_start
) AS next_starting_time
FROM builds_build;
我试着把我看到的东西混在一起:
window = {
"partition_by": [F('customer')],
'order_by': [F('actual_start'),F('planned_start')]
}
records = Record.objects.annotate(
next_customer = Window(
expression = Lead(F('actual_start') if F('actual_start') else F('planned_start'),
**window)
)
)
但是,在查询中,没有考虑前置表达式的条件部分(这就是Django生成的SQL的样子):
但是,它完全删除了预期的“如果”语句。如果您有任何建议和想法,我们将不胜感激在Lead中设置默认值您也可以使用或@iklinac,无论出于何种原因,我甚至没有想到COALESCE。。。看起来效果不错-谢谢!!!在Lead中设置默认值,您也可以使用或@iklinac,无论出于何种原因,我甚至没有考虑COALESCE。。。看起来效果不错-谢谢!!!
SELECT
*,
LEAD(actual_start, 1)
OVER(
PARTITION BY customer
ORDER BY actual_start, planned_start
) AS next_starting_time
FROM builds_build;