我有一个按顺序排列的分类值表,如下所示:
CREATE TABLE cat (name, v1, v2)
AS VALUES
('John', 1::int, 3::int),
('John', 3, 4),
('John', 4, 9),
('Mike', 9, 11),
('Mike', 11, 17),
('John', 17, 24),
('John', 24, 25),
('Dave', 25, 29);
我想按名称列对它们进行分组,获取最小值_1 和最大值_2,但是将它们分组为名称以不间断的顺序出现,如下所示:
+-----------+---------+---------+
| name | value_1 | value_2 |
+-----------+---------+---------+
| John | 1 | 9 |
| Mike | 9 | 17 |
| John | 17 | 25 |
| Dave | 25 | 29 |
+-----------+---------+---------+
但是,执行正常的 GROUP BY 选择会同时返回特定名称的所有条目,无论它们是否一起出现:
SELECT name, MIN(value_1), MAX(value_2)
FROM table
GROUP BY name;
+-----------+---------+---------+
| name | value_1 | value_2 |
+-----------+---------+---------+
| John | 1 | 25 |
| Mike | 9 | 17 |
| Dave | 25 | 29 |
+-----------+---------+---------+
现在,我可能可以用 plpgsql 来做到这一点,使用带有变量、循环等的传统编程逻辑,但我想知道是否有更多 SQL 风格的方法来解决这个问题。
软件:PostgreSQL 9.6.3
使用
value_1
对行进行排序,您可以在每次更改名称时进行分组。然后使用这个组来获取
max
和min
值。dbfiddle在这里
我读这个不同。我假设范围是链接的。例如
应该导致两个不同的范围。为此有一个问题,您的模式是否允许重叠范围?如果没有,我的假设是,这应该有效。
bob, 0, 10
警告,如果你有一个像上面那样的范围,这将不起作用,在这里,我们计算与另一列相比滞后的重置。
然后我们计数得到组(
grp
),然后我们按
grp
专栏分组以完成它。行为差异..