给出下面的表mileage,我应该对每个vehicle_id执行两次求和:一次求和miles的所有条目,另一次求和miles的所有条目,仅其中is_processed = false.

mileage

vehicle_id miles is_processed created_at
773 800 f 2023-04-17 13:11:59.100846
767 200 f 2023-04-24 11:29:52.503024
767 100 t 2023-04-11 15:14:33.125348
773 200 t 2023-04-11 15:49:34.313639
767 150 f 2023-04-24 11:43:31.496871

使用以下两种方法中的一种,这将非常简单:

Method 1

select vehicle_id,
  sum(miles) as total,
  (select sum(miles) from mileage t2 where t1.vehicle_id = t2.vehicle_id and is_processed = false) extra
from mileage t1
group by vehicle_id;

Method 2

在我 Select 的语言中,获取所有记录并使用一个for循环进行计算.

Desired solution

然而,我想知道是否有一种方法可以使用PostgreSQL来完成所有这些任务.我已经try 过窗口函数,但无法弄清楚,分组将涉及对同一个表的第二次扫描,这将损害性能,因为我预计要处理数十万行.

如有任何帮助,我们不胜感激.谢谢!

推荐答案

try "条件聚合",它实际上只是将一个CASE表达式放在聚合函数中.

SELECT vehicle_id
    ,sum(miles) AS total
    ,sum(case when is_processed = false then miles else 0 end) AS extra
FROM mileage t1
GROUP BY vehicle_id;

请记住,Case表达式的计算结果是每一行上的一个值,因此聚合仍然只是对值求和.

Sql相关问答推荐

Oracle中的分层查询

如何退回当年的所有参赛作品?""

Postgres,使用iLike运算符从json数组中搜索的工作方式与从常规表中搜索不同

在甲骨文中查找前一个星期一的S日期

如何利用单列历史SQLsnowflake获得合并结果

合并分层表SQL中的第一个非空、变化的空位置

如何在连接中使用三个不同的列,从而在PostgreSQL中只获得两个列?

用VB.NET在Dapper中实现MS Access数据库顺序透视

违反了完整性约束-值存在时找不到父键

按行值出现的顺序对行值进行分组

YEAR 函数仍然不可SARGable 吗?

如何使用 Google BigQuery 中的条件根据特定列值连接列的 N 行?

获取上个月和上一年的值

如何从postgresql中的项目映射(关联数组)设置值?

基于变量的条件 WHERE 子句

如何使用SELECT语句进行左连接,并根据右表中的特定值过滤结果?

获取 SQL Server 中每一行的两个-之间的文本

Django only() 和 values() 不适用于 prefetch_related()

在 postgresql 中,我可以将其组合成一个查询吗?

在 MindsDB SQL 编辑器中运行 PostgreSQL 条目 ID 时出现未知 Select 目标错误