我想看到数据库中的所有列(通过选择*
)与新列as
,以便我可以分析这些列,而无需复制和粘贴在Excel电子表格中。
如何在group by
键入而不需要键入每列(超过10列),通常它会出现错误,如果我使用这个查询:
select a. *
min(order_date) over(partition by customer_id) as min_order ,
max(order_date) over(partition by customer_id) as max_order ,
max(create_date) over(partition by customer_id) as max_create ,
sum (count(*)) over (partition by customer_id,
create_date order by create_date desc ) count
from purchase a
group by a.customer_id
语句错误显示:
ORA-00937: not a single-group group function ORA-02063: preceding line
from OMSRPT_OMS_OBJECTS
00937. 00000 - "not a single-group group function"
*Cause:
*Action:
谢谢你的帮助
分析函数与聚合函数
- 分析函数和聚合函数不相同
- 有些聚合函数有解析版本,有些没有
- 都处理一组行,但聚合函数总是返回每组1行-与分析函数,结果集不会自动折叠
- 如果你使用分析函数,你不需要GROUP BY子句(在大多数情况下),因为你已经使用Partition BY 分组行了
- 如果您对一些(1个或多个)非聚合选择使用聚合函数,则必须对每个非聚合选择使用Group By
- 在一个选择中结合分析和聚合函数(就像你做的那样)-以错误结束
让我们假设您的样本数据看起来像这样:
WITH
purchase AS
(
Select 1 "CUSTOMER_ID", To_Date('01.12.2022', 'dd.mm.yyyy') "CREATE_DATE", To_Date('01.12.2022', 'dd.mm.yyyy') "ORDER_DATE", 'AAA' "SOME_COLUMN" From Dual Union All
Select 2 "CUSTOMER_ID", To_Date('02.12.2022', 'dd.mm.yyyy') "CREATE_DATE", To_Date('05.12.2022', 'dd.mm.yyyy') "ORDER_DATE", 'BBB' "SOME_COLUMN" From Dual Union All
Select 2 "CUSTOMER_ID", To_Date('04.12.2022', 'dd.mm.yyyy') "CREATE_DATE", To_Date('10.12.2022', 'dd.mm.yyyy') "ORDER_DATE", 'CCC' "SOME_COLUMN" From Dual Union All
Select 3 "CUSTOMER_ID", To_Date('09.12.2022', 'dd.mm.yyyy') "CREATE_DATE", To_Date('12.12.2022', 'dd.mm.yyyy') "ORDER_DATE", 'DDD' "SOME_COLUMN" From Dual Union All
Select 3 "CUSTOMER_ID", To_Date('09.12.2022', 'dd.mm.yyyy') "CREATE_DATE", To_Date('14.12.2022', 'dd.mm.yyyy') "ORDER_DATE", 'EEE' "SOME_COLUMN" From Dual
)
如果您将最后一个选择替换为分析版本,并从代码中排除Group By子句-一切都工作正常(只是稍微纠正了代码)
Select
a.*,
Min(ORDER_DATE) OVER(Partition By CUSTOMER_ID) as min_order,
Max(ORDER_DATE) OVER(Partition By CUSTOMER_ID) as max_order,
Max(CREATE_DATE) OVER(Partition By CUSTOMER_ID) as max_create,
-- the line below is excluded for using combination of SUM() OVER() analytic function with COUNT() aggregate function - you could use Count() OVER() analytic version (2 lines below)
-- Sum(count(*)) OVER(Partition By CUSTOMER_ID, CREATE_DATE order by CREATE_DATE desc ) as sum_count
Count(*) OVER(Partition By CUSTOMER_ID, CREATE_DATE order by CREATE_DATE desc ) as a_count
From purchase a
--Group By a.CUSTOMER_ID -- in this case you don't need GROUP BY clause
…如果一个表的所有分析函数和所有列都没有GROUP BY子句,结果如下:
<表类>CUSTOMER_ID CREATE_DATE ORDER_DATE SOME_COLUMN MIN_ORDER MAX_ORDER MAX_CREATE A_COUNT tbody><<tr>1 01-DEC-22 01-DEC-22 3 01-DEC-22 01-DEC-22 01-DEC-22 1 202-DEC-22 05-DEC-22 BBB 05-DEC-22 10-DEC-22 04-DEC-22 1 204-DEC-22 10-DEC-22 CCC 05-DEC-22 10-DEC-22 04-DEC-22 1 3 09-DEC-22 12-DEC-22 DDD 12-DEC-22 14-DEC-22 09-DEC-22 2 3 09-DEC-22 14-DEC-22 EEE 12-DEC-22 14-DEC-22 09-DEC-22 2 表类>