2016-10-05 8 views
1

各レコードにインジケータと範囲があるテーブルがあり、各インジケータの範囲によってカバーされる合計の広がりを知りたいが、ある指標。複数の範囲でカバーされた合計スプレッドを計算する

私は言葉が続くのがわかりませんが、概念はかなりシンプルです。具体的な例を示します。

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から来たのか? ID1の範囲は1,2,3,4,5,6,11,12,13、および14です。合計10の異なる整数。 ID 2については、3、4、6、7、8、および9を含む範囲があります。合計6つの異なる整数。

問題を理解するのに役立つ場合は、「これらの記録がカレンダーの会議の日時範囲を表している場合、毎日の合計時間数はどこに予約されていますか少なくとも一回?"

重要な場合は、Postgresのバージョンが9.4.8です。

答えて

3
select id, count(*) 
from (
    select distinct id, generate_series(lower(spread), upper(spread) - 1) 
    from records 
) s 
group by id 
; 
id | count 
----+------- 
    1 | 10 
    2 |  6 
+0

ハハ、答えはとても簡単なことが分かります。あなたの心が詰まっているのは面白いです。私は本当に組合(離散した範囲を扱う)をとり、それらの境界を見ているは​​るかに複雑なプロセスに固執しました。あなたの助けに感謝します。 –

関連する問題