【发布时间】:2020-09-04 18:46:37
【问题描述】:
在下面的Postgresql sql中,有没有办法将mo.delivered_at - mo.created_at保存为变量,这样我就不用重复了?
SELECT
to_char(mo.created_at,'MM-YYYY') AS month,
mo.sku_key as sku,
c.name,
COUNT(*) as total,
COUNT(*) FILTER (WHERE mo.delivered_at - mo.created_at < interval '3 days') as three_days,
COUNT(*) FILTER (WHERE mo.delivered_at - mo.created_at > interval '3 days' and mo.delivered_at - mo.created_at <= interval '6 days') as six_days,
COUNT(*) FILTER (WHERE mo.delivered_at - mo.created_at > interval '6 days' and mo.delivered_at - mo.created_at <= interval '9 days') as nine_days,
COUNT(*) FILTER (WHERE mo.delivered_at - mo.created_at > interval '9 days') as ten_days,
min(mo.delivered_at - mo.created_at),
max(mo.delivered_at - mo.created_at),
percentile_disc(0.5) within group (order by mo.delivered_at - mo.created_at) as median,
avg(mo.delivered_at - mo.created_at) as average
FROM medication_order mo
LEFT JOIN subscription s ON s.id=mo.subscription_id
LEFT JOIN condition c on s.condition_id = c.id
WHERE
mo.status = 'DELIVERED' AND
mo.payment_preference = 'INSURANCE' AND
mo.created_at > '2020-01-01' AND
mo.delivered_at IS NOT null AND
mo.sku_key != 'manual_order_sku'
GROUP BY month, mo.sku_key, c.name
【问题讨论】:
-
您可以重新组织以使用 CTE 或子查询。
-
或者,如果您经常使用它,请将其设为生成的列,然后可以对其进行索引。 postgresql.org/docs/12/ddl-generated-columns.html
-
你按
c.name分组。大概是一个冗长的文本列?condition.name是否定义为UNIQUE? (可能应该是。)然后你可以让查询便宜一点...... -
@ErwinBrandstetter 是的,它是一个文本字段。不是独一无二的,现在我看看它。
-
那么你可以有两个distinct条件同名吗?
GROUP BY不会产生误导性结果吗?
标签: sql postgresql datetime count subquery