使用 DATE() 或 Trun() 时按错误分组

Group by Error when using DATE() or Trun()

我正在尝试获取给定 ServiceResource 在给定日期的约会计数。这些值中的每一个都存储在不同的 table 中,需要我使用连接。我使用的代码如下:

select
trunc(s.actualstarttime) "Delivery Date",
s2.name "Van Name", 
count(a.serviceid) "Stops"
from
assignedresource a
join serviceappointment s on s.id = a.serviceid
inner join serviceresource s2 on s2.id = a.serviceid
where
s.status = 'Completed'  and
s.actualstarttime > '2021-12-20 00:00:00' and s.actualstarttime < '2021-12-23 23:00:00'
group by 1, 2
order by
actualstarttime desc;

我的预期输出应该是这样的 table:

2021-12-23 |范A | 3

2021-12-23 |面包车 B | 4

2021-12-22 |范A | 5

但我不断收到此错误: SQL 错误 [500310] [42803]:亚马逊无效操作:列“s.actualstarttime”必须出现在 GROUP BY 子句中或用于聚合函数;

我试过使用 group by trunc(s.actualstarttime), s2.name 还有。谁能帮我弄清楚为什么或如何解决这个问题?

问题是由 ORDER BY 表达式引起的。

涉及的概念称为“函数依赖”,其中与每个组相关的表达式(select 列出表达式、按表达式排序等)必须在函数上依赖于GROUP BY 项。所以我们可以直接 select GROUP BY 项或任何 aggregate/group 函数,如 MAX(s.actualstarttime)

由于每个结果行(组)都基于“交货日期”,您应该可以这样做:

Fiddle based on postgresql 14

select s.actualstarttime::date "Delivery Date"
     , s2.name "Van Name"
     , count(a.serviceid) "Stops"
  from assignedresource a
  join serviceappointment s  on s.id  = a.serviceid
  join serviceresource    s2 on s2.id = a.serviceid
 where s.status = 'Completed'
   and s.actualstarttime > '2021-12-20 00:00:00'
   and s.actualstarttime < '2021-12-23 23:00:00'
 group by 1, 2
 order by s.actualstarttime::date desc
;

结果:

Delivery Date Van Name Stops
2021-12-23 Van A 3
2021-12-23 Van B 4
2021-12-22 Van A 5