【问题标题】:Postgres width_bucket: function width_bucket(bigint, integer[]) does not existPostgres width_bucket:函数 width_bucket(bigint, integer[]) 不存在
【发布时间】:2021-02-03 02:08:08
【问题描述】:

我运行两个不同的查询。这个很好用

with t(n) as(
    values
           (1),
           (1),
           (1),
           (2),
           (10)
)
select
       width_bucket(n,array[1,3,6,15]) g,
       count(*)
from t
group by g
order by g

但是当我运行这个(真实的)查询时,它会在存储桶上报告错误

with data as (
    select
           vendor_id,
           count(distinct pi.id) as cnt
    from payment_invoice_items as pii
    join payment_invoices as pi
        on pii.invoice_id = pi.id
        and pii.deleted_at isnull
    group by vendor_id
)
select
       width_bucket(data.cnt, array[1,10,20,30,40,100,200,400]) as grp,
       count(*)
from data
group by grp
order by grp 

data.cnt 是一列整数数据。为什么会报错?

[42883] 错误:函数 width_bucket(bigint, integer[]) 不存在 提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。

谢谢

【问题讨论】:

  • The data.cnt is a one column of integer data 不,COUNT 返回一个BIGINT,因此您必须在width_bucket 函数中将其显式转换为INTEGER

标签: postgresql


【解决方案1】:

COUNT 函数返回类型 BIGINT,而不是 INTEGER。因此该类型的错误:

[42883] 错误:函数 width_bucket(bigint, integer[]) 不存在 提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。

您需要将COUNT 的结果显式转换为INTEGER 才能在您的函数中使用它:

with data as (
    select
           vendor_id,
           count(distinct pi.id) as cnt
    from payment_invoice_items as pii
    join payment_invoices as pi
        on pii.invoice_id = pi.id
        and pii.deleted_at isnull
    group by vendor_id
)
select
       width_bucket(data.cnt::INTEGER, array[1,10,20,30,40,100,200,400]) as grp,
       count(*)
from data
group by grp
order by grp 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-24
    • 2022-10-13
    • 2021-06-07
    • 1970-01-01
    相关资源
    最近更新 更多