Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtp (Exim 4.80) (envelope-from ) id 1aPIZa-0001O5-Ra for pgsql-sql@arkaria.postgresql.org; Fri, 29 Jan 2016 23:35:27 +0000 Received: from localhost ([127.0.0.1] helo=postgresql.org) by malur.postgresql.org with smtp (Exim 4.84) (envelope-from ) id 1aPIZa-0004Ol-Dw for pgsql-sql@arkaria.postgresql.org; Fri, 29 Jan 2016 23:35:26 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.84) (envelope-from ) id 1aPIYZ-0002VD-Gv for pgsql-sql@postgresql.org; Fri, 29 Jan 2016 23:34:23 +0000 Received: from post.visena.com ([46.226.10.50]) by magus.postgresql.org with esmtps (TLS1.2:DHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.84) (envelope-from ) id 1aPIYV-0008FB-C1 for pgsql-sql@postgresql.org; Fri, 29 Jan 2016 23:34:23 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=visena.com; s=20141101.wh; h=Content-Type:MIME-Version:Subject:In-Reply-To:Message-ID:To:From:Date; bh=8lGXsw9Movn71ggICiiL2H8q6ejmaOGV/ZpE8UIS0nc=; b=oJoCt2vxyoH1PgnsdQeCGkUe55tL2yjFWZqNnTswSJ/c5hAqWC+cpZqhP5pr/QAvQ2sJyaT//u1jFwYFo/rpTMWh7Af16ag8tZ8XOWQy3mLB+Mf6+7pljqSEgWH4Wk4hJz2eIqKpYkbkis26qzeVZBOhO0RSDos48rL8eyqZCzg=; Received: from [10.0.1.10] (helo=tc7-visena.wh.internal.visena.com) by post.visena.com with esmtp (Exim 4.82) (envelope-from ) id 1aPIYS-0001xQ-Gh for pgsql-sql@postgresql.org; Sat, 30 Jan 2016 00:34:18 +0100 Received: from localhost ([127.0.0.1] helo=tc7-visena.wh.internal.visena.com) by tc7-visena.wh.internal.visena.com with esmtp (Exim 4.82) (envelope-from ) id 1aPIYS-0003uv-Ef for pgsql-sql@postgresql.org; Sat, 30 Jan 2016 00:34:16 +0100 Date: Sat, 30 Jan 2016 00:34:16 +0100 (CET) From: Andreas Joseph Krogh To: pgsql-sql@postgresql.org Message-ID: In-Reply-To: Subject: Re: GROUP BY overlapping (tsrange) entries MIME-Version: 1.0 X-Mailer: Visena Mail 2.0.0-SNAPSHOT X-Spam-Score: -1.0 X-Spam-Report: SpamAssasin (score=-1.0, required 5.0 ALL_TRUSTED=-1, HTML_MESSAGE=0.001) X-Pg-Spam-Score: -2.0 (--) Content-Type: multipart/related; boundary="----=_Part_103_760674004.1454110456361" List-Archive: List-Help: List-ID: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: X-Mailing-List: pgsql-sql Precedence: bulk Sender: pgsql-sql-owner@postgresql.org ------=_Part_102_288312555.1454110456361 Content-Type: multipart/related; boundary="----=_Part_103_760674004.1454110456361" ------=_Part_103_760674004.1454110456361 Content-Type: multipart/alternative; boundary="----=_Part_104_1200047585.1454110456396" ------=_Part_104_1200047585.1454110456396 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable P=C3=A5 fredag 29. januar 2016 kl. 20:23:01, skrev David G. Johnston < david.g.johnston@gmail.com >: On Fri, Jan 29, 2016 at 10:30 AM, Andreas Joseph Krogh > wrote: P=C3=A5 fredag 29. januar 2016 kl. 17:59:52, skrev David G. Johnston < david.g.johnston@gmail.com >: On Fri, Jan 29, 2016 at 9:45 AM, Andreas Joseph Krogh > wrote: P=C3=A5 fredag 29. januar 2016 kl. 02:43:37, skrev Andreas Joseph Krogh < andreas@visena.com >: P=C3=A5 fredag 29. januar 2016 kl. 02:11:52, skrev Andreas Joseph Krogh < andreas@visena.com >: P=C3=A5 fredag 29. januar 2016 kl. 02:02:46, skrev Michael Moore < michaeljmoore@gmail.com >: It is unclear to me how you got from your input data to your expected outpu= t.=20 If you are "trying to count() overlapping entries" then it would seem to me= =20 that you would only have only one value for the count. Either a range overl= aps=20 or it does not. =C2=A0 Oh, sorry, the count was in wrong order. =C2=A0 Let me explain, insert into event(name, start_time, end_time) values('a', '2015-12-20', NUL= L)=20 , ('a', '2015-12-20', '2015-12-31') , ('a', '2015-12-25', '2016-01-01') , (= 'b',=20 '2015-11-20', '2015-11-24') , ('c', '2016-02-01', '2016-02-03') , ('c',=20 '2016-02-01', '2016-02-04') , ('c', '2016-02-01', NULL) ;=20 All 'a', 'b' and 'c' have points in common, with count a=3D3, b=3D1, c=3D3. =C2=A0 Note that the 'name'-column here is just to explain what I'm after and that= I=20 have no such column. =C2=A0 Any clever hints anyone? =C2=A0 =C2=A0 =E2=80=8BMaybe this will help...? =C2=A0 =E2=80=8B =C2=A0https://wiki.postgresql.org/wiki/Range_aggregation=20 =C2=A0 =E2=80=8BDavid J.=E2=80=8B =C2=A0 Yea, I've seen it, but don't like it. =C2=A0 I was (am) hoping some clever PG-guy would step up and craft som clever GRO= UP=20 BY stuff like "GROUP BY magic_gist_equals(tsrange with &&)" =C2=A0 =C2=A0 =E2=80=8Bhttp://www.postgresql.org/docs/9.5/static/sql-select.html=20 =E2=80=8B""" =E2=80=8B =C2=A0GROUP BY will condense into a single row all selected rows that share= the=20 same values for the grouped expressions """ =C2=A0 =E2=80=8BWhich means the only valid comparison for GROUP BY is equals.=C2= =A0 The processes=20 of finding a single value upon which such an equality comparison can be=20 performed is the subject of the wiki page I linked. =C2=A0 Yes, I know but I'm hoping someone has a more clever idea. =C2=A0 =C2=A0 The only other potential query approach that comes to mind is some kind of= =20 recursive CTE. =C2=A0 Interesting. Care to give an example of how to solve this using recursive C= TE? =C2=A0 A more structural potential approach would involve triggers and main= taining=20 some form of master range table that evolves as DML is executed against the= =20 base table. =C2=A0 Yes, but I'm using the count() for calculating the cardinality of something= ,=20 which might change based on some other column in another table, which is=20 JOIN'ed in in my real query. So a de-normalized piggy-backing table would b= e=20 quite non-trivial to maintain. =C2=A0 -- Andreas Joseph Krogh CTO / Partner - Visena AS Mobile: +47 909 56 963 andreas@visena.com www.visena.com =C2=A0 ------=_Part_104_1200047585.1454110456396 Content-Type: text/html;charset=UTF-8 Content-Transfer-Encoding: quoted-printable
P=C3=A5 fredag 29. januar 2016 kl. 20:23:01, skrev David G. Johnston &= lt;david.g.johnston@gmail.com= >:
On Fri, Jan 29, 2016 at 10:= 30 AM, Andreas Joseph Krogh <andreas@visena.com> wrote:
P=C3=A5 fredag 29. januar 2016 kl. 17:59:52, skrev David G. Johnston &= lt;david.g.= johnston@gmail.com>:
On Fri, Jan 29, 2016 at 9:45 AM, Andreas Joseph Kro= gh <andreas@visena.com&= gt; wrote:
P=C3=A5 fredag 29. januar 2016 kl. 02:43:37, skrev Andreas Josep= h Krogh <andreas= @visena.com>:
P=C3=A5 fredag 29. januar 2016 kl. 02:11:52, skrev Andreas Josep= h Krogh <andreas= @visena.com>:
P=C3=A5 fredag 29. januar 2016 kl. 02:02:46, skrev Michael Moore= <michaeljm= oore@gmail.com>:
It is unclear to me how you got from your input data= to your expected output. If you are "trying to count() overlapping entries" then it would seem to me that = you would only have only one value for the count. Either a range overlaps o= r it does not.
=C2=A0
Oh, sorry, the count was in wrong order.
=C2=A0
Let me explain,
insert into event(name, start_time, end_time)=

    values('a', '2015-12-20', NULL)
        , ('a', =
'2015-12-20', '2015-12-31')
        , ('a', =
'2015-12-25', '2016-01-01')
        , ('b', =
'2015-11-20', '2015-11-24')
        , ('c', =
'2016-02-01', '2016-02-03')
        , ('c', =
'2016-02-01', '2016-02-04')
        , ('c', '2016-02-01', NULL)
;
All 'a', 'b' and 'c' have points in common, with count a=3D3, b= =3D1, c=3D3.
=C2=A0
Note that the 'name'-column here is just to explain what I'm aft= er and that I have no such column.
=C2=A0
Any clever hints anyone?
=C2=A0
=C2=A0
=E2=80= =8BMaybe this will help...?
=C2=A0=
=C2=A0
=E2=80=8BDavid J.=E2= =80=8B
=C2=A0
Yea, I've seen it, but don't like it.
=C2=A0
I was (am) hoping some clever PG-guy would step up and craft som cleve= r GROUP BY stuff like "GROUP BY magic_gist_equals(tsrange with &&a= mp;)"
=C2=A0
=C2=A0
=E2=80=8B"""
=E2=80=8B
=C2=A0GROUP BY will con= dense into a single row all selected rows that share the same values for th= e grouped expressions
"""
=C2=A0
=E2=80=8BWhich means the only valid comparison for GROUP BY is equals.= =C2=A0 The processes of finding a single value upon which such an equality = comparison can be performed is the subject of the wiki page I linked.
=C2=A0
Yes, I know but I'm hoping someone has a more clever idea.
=C2=A0
=C2=A0
The only other potential query approach that comes to mind is some kin= d of recursive CTE.
=C2=A0
Interesting. Care to give an example of how to solve this using recurs= ive CTE?
=C2=A0
A more structural potential approach would involve triggers and maintain= ing some form of master range table that evolves as DML is executed against= the base table.
=C2=A0
Yes, but I'm using the count() for calculating the cardinality of some= thing, which might change based on some other column in another table, whic= h is JOIN'ed in in my real query. So a de-normalized piggy-backing table wo= uld be quite non-trivial to maintain.
=C2=A0
--
Andrea= s Joseph Krogh
CTO / Partner<= /span> - Visena AS
Mobile: +47 90= 9 56 963
=3D""
=C2=A0
------=_Part_104_1200047585.1454110456396-- ------=_Part_103_760674004.1454110456361 Content-Type: image/png Content-Transfer-Encoding: base64 Content-Disposition: inline Content-ID: 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 ------=_Part_103_760674004.1454110456361-- ------=_Part_102_288312555.1454110456361--