sql - 使用 width_bucket 获取结果范围
问题描述
我正在尝试使用width_bucket
并在结果中有一个列与我的存储桶的边界进行查询。有没有一种简单的方法可以做到这一点?
我的查询:
SELECT width_bucket(
(EXTRACT(epoch FROM S.end - S.start) / 60)::integer,
array[0, 15, 30, 45, 60, 75, 90, 1000]
) AS buckets,
count(*)
FROM shipments_site S
WHERE S.deleted IS NULL
GROUP BY buckets
ORDER BY buckets
结果:
buckets | count
1 | 20
2 | 6
3 | 22
4 | 25
5 | 10
6 | 11
7 | 6
我想要得到什么:
buckets | count | interval
1 | 20 | [0, 15]
2 | 6 | [15, 30]
3 | 22 | [30, 45]
4 | 25 | [45, 60]
5 | 10 | [60, 75]
6 | 11 | [75, 90]
7 | 6 | [90, 1000]
解决方案
这是一种方法:
SELECT v.bucket, count(*),
CONCAT( (array[0, 15, 30, 45, 60, 75, 90, 1000])[v.bucket], '-',
(array[0, 15, 30, 45, 60, 75, 90, 1000])[v.bucket + 1]
) as bounds
FROM shipments_site S CROSS JOIN LATERAL
(VALUES (width_bucket((EXTRACT(epoch FROM S.end - S.start) / 60)::integer,
array[0, 15, 30, 45, 60, 75, 90, 1000]
)
)
) v(bucket)
WHERE S.deleted IS NULL
GROUP BY v.bucket
ORDER BY v.bucket;
这个想法是使用横向连接来定义bucket
. 然后只需索引数组中的存储桶即可获得边界。
如果您不想重复数组,也可以将其包含在FROM
子句中:
SELECT v.bucket, count(*),
CONCAT( (v_ar.ar_bounds)[v.bucket], '-',
(v_ar.ar_bounds)[v.bucket + 1]
) as bounds
FROM shipments_site S CROSS JOIN
(values (array[0, 15, 30, 45, 60, 75, 90, 1000])
) v_ar(ar_bounds) CROSS JOIN LATERAL
(VALUES (width_bucket((EXTRACT(epoch FROM S.end - S.start) / 60)::integer,
v_ar.ar_bounds
)
)
) v(bucket)
WHERE S.deleted IS NULL
GROUP BY v.bucket, v_ar.ar_bounds
ORDER BY v.bucket;
这是一个 db<>fiddle。
推荐阅读
- c# - 防止添加“To”SOAP 标头
- angular - StaticInjectorError(AppModule)[AddBidComponent -> Date]:
- android - 我们可以一起使用 BaseObservable 和 LiveData
- python - 如何在python的列表中找到字典匹配键值的平均值
- gulp-4 - Gulp 4 默认任务
- amazon-web-services - 如果将 Cloudflare 与 Amazon S3 集成用于视频流后端,可以节省多少成本?
- python - OMP:错误 #15:正在初始化 libiomp5.dylib,但发现 libiomp5.dylib 已初始化
- c# - 如何从字节数组 c# MVC .NET Core 在 iframe 中显示 pdf
- python - Keras 自定义层:根据条件更改张量的值
- unity3d - 将模型从 3dsmax 导入带有光照的 unity3d