使用 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)
等
由于每个结果行(组)都基于“交货日期”,您应该可以这样做:
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
我正在尝试获取给定 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)
等
由于每个结果行(组)都基于“交货日期”,您应该可以这样做:
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 |