计算几个范围所涵盖的总传播范围

时间:2016-10-05 20:53:35

标签: postgresql

我有一张表,其中每条记录都有一个指标和一个范围,我想知道每个指标的范围所涵盖的总点差 - 但是当某个指标的范围重叠时,不会重复计算。

我可以看到措辞难以理解,但这个概念非常简单。让我举一个说明性的例子。

CREATE TABLE records(id int, spread int4range);
INSERT INTO records VALUES
    (1, int4range(1, 4)),
    (1, int4range(2, 7)),
    (1, int4range(11, 15)),
    (2, int4range(3, 5)),
    (2, int4range(6, 10));
SELECT * FROM records;

产生输出:

 id | spread
----+---------
  1 | [1,4)
  1 | [2,7)
  1 | [11,15)
  2 | [3,5)
  2 | [6,10)
(5 rows)

我现在想要一个提供以下输出的查询:

id | total
---+--------
 1 |  10
 2 |   6

数字10和6来自哪里?对于ID 1,我们的范围包括1,2,3,4,5,6,11,12,13和14;共有10个不同的整数。对于ID 2,我们的范围包括3,4,6,7,8和9;共有六个不同的整数。

如果它可以帮助您理解问题,您可以将其想象为“如果这些记录代表我日历上会议的日期和时间范围,那么我每天预订的总时数是多少一次?“

Postgres版本是9.4.8,如果重要的话。

1 个答案:

答案 0 :(得分:3)

perform