sql - 使用 Postgres 如何按范围类型分组
问题描述
按独家范围类型分组的最佳方法是什么。考虑以下。
CREATE EXTENSION IF NOT EXISTS btree_gist;
create table if not exists ranges (
"id" uuid NOT NULL DEFAULT uuid_generate_v4(),
"name" character varying NOT NULL,
"range" numrange NOT NULL,
EXCLUDE USING gist (range WITH &&)
);
create table if not exists customers (
"id" uuid NOT NULL DEFAULT uuid_generate_v4(),
"name" character varying NOT NULL,
"score" integer NOT NULL
)
insert into ranges (name, range) VALUES ('awesome', '[75,)'::numrange);
insert into ranges (name, range) VALUES ('good', '[50,75)'::numrange);
insert into ranges (name, range) VALUES ('ok', '[25,50)'::numrange);
insert into ranges (name, range) VALUES ('bad', '[,25)'::numrange);
insert into customers (name, score) VALUES ('A', 10);
insert into customers (name, score) VALUES ('B', 10);
insert into customers (name, score) VALUES ('C', 80);
我想要一个将返回以下内容的查询...
| range name | count of customers in range |
| 'awesome' | 1 |
| 'bad' | 2 |
我不确定如何实现这一目标。希望得到一些指导
谢谢!!
(注:在 PG 12 上)
解决方案
好吧,我认为这很简单:
select r.name,
count(c.*)
from ranges r
left join customers c on r.range::numrange @> c.score::numeric
group by 1
推荐阅读
- c++ - 如果在 C++ 中,如何将 gcc __is_class 与预处理器一起使用
- node.js - 具有 RedBird.js 和 Node.js 的 SSL 证书,在一台服务器上具有两个域
- r - 你如何打印上面的时间序列描述?
- javascript - 代码在控制台上运行良好,但在通过浏览器扩展注入时出错(适用于 chrome 而不是 Firefox)
- excel - 将特定范围附加到 CSV
- python - 退出状态为 1 的 Pip 安装文件退出
- loops - 在 Row 小部件内循环以创建 TEXT 列表
- python-3.x - 限制 DICOM 标签
- kotlin - 如何在 kotlin 中通过函数式编程正确使用 reduce 函数
- javascript - 使用 jQuery Datepicker 禁用日期