pg.ddx.io  pgsql-sql@postgresql.org mailing list archive  
help / color / mirror / Atom feed
grouping subsets
16+ messages / 6 participants
[nested] [flat]

* grouping subsets
@ 2010-07-22 08:09 Rainer Stengele <rainer.stengele@diplan.de>
  2010-07-22 10:02 ` Re: grouping subsets A. Kretschmer <andreas.kretschmer@schollglas.com>
  2010-07-22 13:18 ` Re: grouping subsets Oliveiros d'Azevedo Cristina <oliveiros.cristina@marktest.pt>
  2010-07-27 10:37 ` Re: grouping subsets Oliveiros d'Azevedo Cristina <oliveiros.cristina@marktest.pt>
  0 siblings, 3 replies; 16+ messages in thread

From: Rainer Stengele @ 2010-07-22 08:09 UTC (permalink / raw)
  To: pgsql-sql

Hi,

having a table similar to

| 1 | B | [2010-07-15 Do] |
| 1 | B | [2010-07-16 Fr] |
|---+---+-----------------|
| 2 | C | [2010-07-17 Sa] |
| 2 | C | [2010-07-18 So] |
|---+---+-----------------|
| 1 | B | [2010-07-19 Mo] |
| 1 | B | [2010-07-20 Di] |
| 1 | B | [2010-07-21 Mi] |
| 1 | B | [2010-07-22 Do] |
|---+---+-----------------|
| 3 | D | [2010-07-23 Fr] |

a simple group by gives me:

| 6 | B |
| 4 | C |
| 3 | D |


What I want to get is the values grouped by "subset", where a subset is a set of rows with identical column until the colum changes.
Is there a way to get

| 2 | B |
| 4 | C |
| 4 | B |
| 3 | D |

by SQL only?

- Rainer







^ permalink  raw  reply  [nested|flat] 16+ messages in thread

* Re: grouping subsets
  2010-07-22 08:09 grouping subsets Rainer Stengele <rainer.stengele@diplan.de>
@ 2010-07-22 10:02 ` A. Kretschmer <andreas.kretschmer@schollglas.com>
  2010-07-22 10:53   ` Re: grouping subsets Richard Huxton <dev@archonet.com>
  2 siblings, 1 reply; 16+ messages in thread

From: A. Kretschmer @ 2010-07-22 10:02 UTC (permalink / raw)
  To: pgsql-sql

In response to Rainer Stengele :
> Hi,
> 
> having a table similar to
> 
> | 1 | B | [2010-07-15 Do] |
> | 1 | B | [2010-07-16 Fr] |
> |---+---+-----------------|
> | 2 | C | [2010-07-17 Sa] |
> | 2 | C | [2010-07-18 So] |
> |---+---+-----------------|
> | 1 | B | [2010-07-19 Mo] |
> | 1 | B | [2010-07-20 Di] |
> | 1 | B | [2010-07-21 Mi] |
> | 1 | B | [2010-07-22 Do] |
> |---+---+-----------------|
> | 3 | D | [2010-07-23 Fr] |
> 
> a simple group by gives me:
> 
> | 6 | B |
> | 4 | C |
> | 3 | D |
> 
> 
> What I want to get is the values grouped by "subset", where a subset is a set of rows with identical column until the colum changes.
> Is there a way to get
> 
> | 2 | B |
> | 4 | C |
> | 4 | B |
> | 3 | D |
> 
> by SQL only?

I think, the problem is that there are 2 identical groups. I think, you
can write a pl/pgsql-proc, selecting all ordered by the date-field and
walking through the result to do the grouping, checking if the 2nd
column is different from the previous. 

With plain SQL it's maybe possible too, but i don't know how ...

Regards, Andreas
-- 
Andreas Kretschmer
Kontakt:  Heynitz: 035242/47150,   D1: 0160/7141639 (mehr: -> Header)
GnuPG: 0x31720C99, 1006 CCB4 A326 1D42 6431  2EB0 389D 1DC2 3172 0C99



^ permalink  raw  reply  [nested|flat] 16+ messages in thread

* Re: grouping subsets
  2010-07-22 08:09 grouping subsets Rainer Stengele <rainer.stengele@diplan.de>
  2010-07-22 10:02 ` Re: grouping subsets A. Kretschmer <andreas.kretschmer@schollglas.com>
@ 2010-07-22 10:53   ` Richard Huxton <dev@archonet.com>
  2010-07-22 11:31     ` Re: grouping subsets Tim Landscheidt <tim@tim-landscheidt.de>
  0 siblings, 1 reply; 16+ messages in thread

From: Richard Huxton @ 2010-07-22 10:53 UTC (permalink / raw)
  To: A. Kretschmer <andreas.kretschmer@schollglas.com>; +Cc: pgsql-sql

On 22/07/10 11:02, A. Kretschmer wrote:
> In response to Rainer Stengele :
>> What I want to get is the values grouped by "subset", where a subset is a set of rows with identical column until the colum changes.
>> Is there a way to get
>>
>> | 2 | B |
>> | 4 | C |
>> | 4 | B |
>> | 3 | D |
>>
>> by SQL only?
>
> I think, the problem is that there are 2 identical groups. I think, you
> can write a pl/pgsql-proc, selecting all ordered by the date-field and
> walking through the result to do the grouping, checking if the 2nd
> column is different from the previous.
>
> With plain SQL it's maybe possible too, but i don't know how ...

It should be do-able in 8.4 onwards, look into windowing functions. In 
particular the lag() function:

SELECT
     mycode,
     mydate,
     lag(mycode) OVER (ORDER BY mydate) AS prev_code
FROM
     mytable
ORDER BY mydate;

It should be possible to use that as a subquery with an outer query that 
compares mycode=prev_code to get a run length.

-- 
   Richard Huxton
   Archonet Ltd



^ permalink  raw  reply  [nested|flat] 16+ messages in thread

* Re: grouping subsets
  2010-07-22 08:09 grouping subsets Rainer Stengele <rainer.stengele@diplan.de>
  2010-07-22 10:02 ` Re: grouping subsets A. Kretschmer <andreas.kretschmer@schollglas.com>
  2010-07-22 10:53   ` Re: grouping subsets Richard Huxton <dev@archonet.com>
@ 2010-07-22 11:31     ` Tim Landscheidt <tim@tim-landscheidt.de>
  2010-07-30 15:58       ` Re: grouping subsets Joshua Tolley <eggyknap@gmail.com>
  0 siblings, 1 reply; 16+ messages in thread

From: Tim Landscheidt @ 2010-07-22 11:31 UTC (permalink / raw)
  To: pgsql-sql

Richard Huxton <dev@archonet.com> wrote:

>>> What I want to get is the values grouped by "subset", where a subset is a set of rows with identical column until the colum changes.
>>> Is there a way to get

>>> | 2 | B |
>>> | 4 | C |
>>> | 4 | B |
>>> | 3 | D |

>>> by SQL only?

>> I think, the problem is that there are 2 identical groups. I think, you
>> can write a pl/pgsql-proc, selecting all ordered by the date-field and
>> walking through the result to do the grouping, checking if the 2nd
>> column is different from the previous.

>> With plain SQL it's maybe possible too, but i don't know how ...

> It should be do-able in 8.4 onwards, look into windowing
> functions. In particular the lag() function:

> SELECT
>     mycode,
>     mydate,
>     lag(mycode) OVER (ORDER BY mydate) AS prev_code
> FROM
>     mytable
> ORDER BY mydate;

> It should be possible to use that as a subquery with an
> outer query that compares mycode=prev_code to get a run
> length.

Hmmm. Can the outer query be done without using "WITH
RECURSIVE"?

Tim




^ permalink  raw  reply  [nested|flat] 16+ messages in thread

* Re: grouping subsets
  2010-07-22 08:09 grouping subsets Rainer Stengele <rainer.stengele@diplan.de>
  2010-07-22 10:02 ` Re: grouping subsets A. Kretschmer <andreas.kretschmer@schollglas.com>
  2010-07-22 10:53   ` Re: grouping subsets Richard Huxton <dev@archonet.com>
  2010-07-22 11:31     ` Re: grouping subsets Tim Landscheidt <tim@tim-landscheidt.de>
@ 2010-07-30 15:58       ` Joshua Tolley <eggyknap@gmail.com>
  0 siblings, 0 replies; 16+ messages in thread

From: Joshua Tolley @ 2010-07-30 15:58 UTC (permalink / raw)
  To: pgsql-sql

On Thu, Jul 22, 2010 at 11:31:23AM +0000, Tim Landscheidt wrote:
> Richard Huxton <dev@archonet.com> wrote:
> 
> >>> What I want to get is the values grouped by "subset", where a subset is a set of rows with identical column until the colum changes.
> >>> Is there a way to get
> 
> >>> | 2 | B |
> >>> | 4 | C |
> >>> | 4 | B |
> >>> | 3 | D |
> 
> >>> by SQL only?
> 
> >> I think, the problem is that there are 2 identical groups. I think, you
> >> can write a pl/pgsql-proc, selecting all ordered by the date-field and
> >> walking through the result to do the grouping, checking if the 2nd
> >> column is different from the previous.
> 
> >> With plain SQL it's maybe possible too, but i don't know how ...
> 
> > It should be do-able in 8.4 onwards, look into windowing
> > functions. In particular the lag() function:
> 
> > SELECT
> >     mycode,
> >     mydate,
> >     lag(mycode) OVER (ORDER BY mydate) AS prev_code
> > FROM
> >     mytable
> > ORDER BY mydate;
> 
> > It should be possible to use that as a subquery with an
> > outer query that compares mycode=prev_code to get a run
> > length.
> 
> Hmmm. Can the outer query be done without using "WITH
> RECURSIVE"?

How about this:

select
    a, b, c, d, sum
from (
    select
        a, b, c, d, new_partition,
        sum(e) over (partition by partition_num) 
    from (
        select
            a, b, c, d, e,
            case when
                lag(a, 1, null) over (order by d) is null or
                lag(a, 1, null) over (order by d) != a or
                lag(b, 1, null) over (order by d) is null or
                lag(b, 1, null) over (order by d) != b or
                lag(c, 1, null) over (order by d) is null or
                lag(c, 1, null) over (order by d) != c
                    then nextval('a')
                else currval('a')
            end as partition_num,
            case when
                lag(a, 1, null) over (order by d) is null or
                lag(a, 1, null) over (order by d) != a or
                lag(b, 1, null) over (order by d) is null or
                lag(b, 1, null) over (order by d) != b or
                lag(c, 1, null) over (order by d) is null or
                lag(c, 1, null) over (order by d) != c
                    then 'T'::boolean
                else 'f'::boolean
            end as new_partition
        from foo
    ) bar
) baz
where
    new_partition;

Here's my test table:
5432 josh@postgres# select * from foo;
 a | b | c |           d            | e 
---+---+---+------------------------+---
 1 | 9 | 1 | 2007-01-01 00:00:05-07 | 8
 9 | 2 | 1 | 2007-01-01 00:00:10-07 | 4
 9 | 2 | 1 | 2007-01-01 00:00:15-07 | 6
 9 | 2 | 1 | 2007-01-01 00:00:20-07 | 2
 6 | 5 | 7 | 2007-01-01 00:00:25-07 | 3
 4 | 9 | 0 | 2007-01-01 00:00:30-07 | 0
 4 | 9 | 0 | 2007-01-01 00:00:35-07 | 7
 5 | 2 | 7 | 2007-01-01 00:01:25-07 | 7
 5 | 2 | 7 | 2007-01-01 00:01:30-07 | 7
 5 | 2 | 7 | 2007-01-01 00:01:35-07 | 9
 5 | 2 | 7 | 2007-01-01 00:01:40-07 | 2
 5 | 2 | 7 | 2007-01-01 00:01:45-07 | 5
 5 | 2 | 7 | 2007-01-01 00:01:50-07 | 8
 5 | 2 | 7 | 2007-01-01 00:01:55-07 | 5
 5 | 2 | 7 | 2007-01-01 00:02:00-07 | 9
 7 | 8 | 8 | 2007-01-01 00:02:05-07 | 7
 7 | 8 | 8 | 2007-01-01 00:02:10-07 | 8
 9 | 3 | 0 | 2007-01-01 00:02:15-07 | 0
 9 | 3 | 0 | 2007-01-01 00:02:20-07 | 8
 9 | 2 | 1 | 2007-01-01 00:02:25-07 | 3
 9 | 2 | 1 | 2007-01-01 00:02:30-07 | 3
(21 rows)

...and these results...
 a | b | c |           d            | sum 
---+---+---+------------------------+-----
 1 | 9 | 1 | 2007-01-01 00:00:05-07 |   8
 9 | 2 | 1 | 2007-01-01 00:00:10-07 |  12
 6 | 5 | 7 | 2007-01-01 00:00:25-07 |   3
 4 | 9 | 0 | 2007-01-01 00:00:30-07 |   7
 5 | 2 | 7 | 2007-01-01 00:01:25-07 |  52
 7 | 8 | 8 | 2007-01-01 00:02:05-07 |  15
 9 | 3 | 0 | 2007-01-01 00:02:15-07 |   8
 9 | 2 | 1 | 2007-01-01 00:02:25-07 |   6
(8 rows)

--
Joshua Tolley / eggyknap
End Point Corporation
http://www.endpoint.com

Attachments:

  [application/pgp-signature] signature.asc (196B, ../../4c52f6b3.02b28f0a.02e2.ffff9a9e@mx.google.com/2-signature.asc)
  download

^ permalink  raw  reply  [nested|flat] 16+ messages in thread

* Re: grouping subsets
  2010-07-22 08:09 grouping subsets Rainer Stengele <rainer.stengele@diplan.de>
@ 2010-07-22 13:18 ` Oliveiros d'Azevedo Cristina <oliveiros.cristina@marktest.pt>
  2010-07-22 13:25   ` Re: grouping subsets Rainer Stengele <rainer.stengele@diplan.de>
  2 siblings, 1 reply; 16+ messages in thread

From: Oliveiros d'Azevedo Cristina @ 2010-07-22 13:18 UTC (permalink / raw)
  To: pgsql-sql; Rainer Stengele <rainer.stengele@diplan.de>

Howdy, Rainer.

Please advice me,

The dates always follow that sequential pattern?

Or can be holes on the dates sequence?

Best,
Oliveiros

----- Original Message ----- 
From: "Rainer Stengele" <rainer.stengele@diplan.de>
To: <pgsql-sql@postgresql.org>
Sent: Thursday, July 22, 2010 9:09 AM
Subject: [SQL] grouping subsets


> Hi,
>
> having a table similar to
>
> | 1 | B | [2010-07-15 Do] |
> | 1 | B | [2010-07-16 Fr] |
> |---+---+-----------------|
> | 2 | C | [2010-07-17 Sa] |
> | 2 | C | [2010-07-18 So] |
> |---+---+-----------------|
> | 1 | B | [2010-07-19 Mo] |
> | 1 | B | [2010-07-20 Di] |
> | 1 | B | [2010-07-21 Mi] |
> | 1 | B | [2010-07-22 Do] |
> |---+---+-----------------|
> | 3 | D | [2010-07-23 Fr] |
>
> a simple group by gives me:
>
> | 6 | B |
> | 4 | C |
> | 3 | D |
>
>
> What I want to get is the values grouped by "subset", where a subset is a 
> set of rows with identical column until the colum changes.
> Is there a way to get
>
> | 2 | B |
> | 4 | C |
> | 4 | B |
> | 3 | D |
>
> by SQL only?
>
> - Rainer
>
>
>
>
>
> -- 
> Sent via pgsql-sql mailing list (pgsql-sql@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-sql 




^ permalink  raw  reply  [nested|flat] 16+ messages in thread

* Re: grouping subsets
  2010-07-22 08:09 grouping subsets Rainer Stengele <rainer.stengele@diplan.de>
  2010-07-22 13:18 ` Re: grouping subsets Oliveiros d'Azevedo Cristina <oliveiros.cristina@marktest.pt>
@ 2010-07-22 13:25   ` Rainer Stengele <rainer.stengele@diplan.de>
  2010-07-22 14:18     ` Re: grouping subsets Tim Landscheidt <tim@tim-landscheidt.de>
  0 siblings, 1 reply; 16+ messages in thread

From: Rainer Stengele @ 2010-07-22 13:25 UTC (permalink / raw)
  To: Oliveiros d'Azevedo Cristina <oliveiros.cristina@marktest.pt>; +Cc: pgsql-sql

 Hi Oliveiros,

yes, the date is always incremented - but anyway the date column is not really the point!
Actually the first tow columns are relevant.
I want them gouped together as indicated, adding up column 1 in the blocks with identical second column, but not adding up over all the rows.

Hope I could express it!

Mit freundlichen Grüßen / Best Regards
    Rainer Stengele 

__|___ 
  | Dipl. Inf. (Univ.) Rainer Stengele   
  | Technical Control - System Administration  
  |
  | email    : Rainer.Stengele@diplan.de 
  | voice/fax: ++49-9131-7778-85/88
  | WWW      : http://www.diplan.de 
  |
  | diplan GmbH                                
  | Wetterkreuz 27
  | 91058 Erlangen, Germany                      
 
Diese E-Mail kann vertrauliche und/oder rechtlich geschützte Informationen enthalten. Wenn Sie nicht der richtige Adressat sind oder diese E-Mail irrtümlich erhalten haben, informieren Sie bitte den Absender und vernichten Sie diese Mail. Das unerlaubte Kopieren sowie die unbefugte Weitergabe dieser Mail ist nicht gestattet.

This e-mail may contain confidential and/or privileged information. If you are not the intended recipient (or have received this e-mail in error) please notify the sender immediately and destroy this e-mail. Any unauthorized copying, disclosure or distribution of the material in this e-mail is strictly forbidden.



Am 22.07.2010 15:18, schrieb Oliveiros d'Azevedo Cristina:
> Howdy, Rainer.
>
> Please advice me,
>
> The dates always follow that sequential pattern?
>
> Or can be holes on the dates sequence?
>
> Best,
> Oliveiros
>
> ----- Original Message ----- From: "Rainer Stengele" <rainer.stengele@diplan.de>
> To: <pgsql-sql@postgresql.org>
> Sent: Thursday, July 22, 2010 9:09 AM
> Subject: [SQL] grouping subsets
>
>
>> Hi,
>>
>> having a table similar to
>>
>> | 1 | B | [2010-07-15 Do] |
>> | 1 | B | [2010-07-16 Fr] |
>> |---+---+-----------------|
>> | 2 | C | [2010-07-17 Sa] |
>> | 2 | C | [2010-07-18 So] |
>> |---+---+-----------------|
>> | 1 | B | [2010-07-19 Mo] |
>> | 1 | B | [2010-07-20 Di] |
>> | 1 | B | [2010-07-21 Mi] |
>> | 1 | B | [2010-07-22 Do] |
>> |---+---+-----------------|
>> | 3 | D | [2010-07-23 Fr] |
>>
>> a simple group by gives me:
>>
>> | 6 | B |
>> | 4 | C |
>> | 3 | D |
>>
>>
>> What I want to get is the values grouped by "subset", where a subset is a set of rows with identical column until the colum changes.
>> Is there a way to get
>>
>> | 2 | B |
>> | 4 | C |
>> | 4 | B |
>> | 3 | D |
>>
>> by SQL only?
>>
>> - Rainer
>>
>>
>>
>>
>>
>> -- 
>> Sent via pgsql-sql mailing list (pgsql-sql@postgresql.org)
>> To make changes to your subscription:
>> http://www.postgresql.org/mailpref/pgsql-sql 
>
>



^ permalink  raw  reply  [nested|flat] 16+ messages in thread

* Re: grouping subsets
  2010-07-22 08:09 grouping subsets Rainer Stengele <rainer.stengele@diplan.de>
  2010-07-22 13:18 ` Re: grouping subsets Oliveiros d'Azevedo Cristina <oliveiros.cristina@marktest.pt>
  2010-07-22 13:25   ` Re: grouping subsets Rainer Stengele <rainer.stengele@diplan.de>
@ 2010-07-22 14:18     ` Tim Landscheidt <tim@tim-landscheidt.de>
  0 siblings, 0 replies; 16+ messages in thread

From: Tim Landscheidt @ 2010-07-22 14:18 UTC (permalink / raw)
  To: pgsql-sql

Rainer Stengele <rainer.stengele@diplan.de> wrote:

> yes, the date is always incremented - but anyway the date
> column is not really the point! Actually the first tow
> columns are relevant. I want them gouped together as
> indicated, adding up column 1 in the blocks with identical
> second column, but not adding up over all the rows.
> [...]

If the date column wasn't relevant, how would you group the
first two columns?

Tim




^ permalink  raw  reply  [nested|flat] 16+ messages in thread

* Re: grouping subsets
  2010-07-22 08:09 grouping subsets Rainer Stengele <rainer.stengele@diplan.de>
@ 2010-07-27 10:37 ` Oliveiros d'Azevedo Cristina <oliveiros.cristina@marktest.pt>
  2010-07-29 09:41   ` Re: grouping subsets Rainer Stengele <rainer.stengele@diplan.de>
  2 siblings, 1 reply; 16+ messages in thread

From: Oliveiros d'Azevedo Cristina @ 2010-07-27 10:37 UTC (permalink / raw)
  To: pgsql-sql; Rainer Stengele <rainer.stengele@diplan.de>

Howdy, Rainer.

It's been a while, so I don't know if you are still interested in this 
problem or if you, in the meantime, found yourself a solution,
but I've tried this on a local copy of the example you provided   and it 
seems to work.

The problem is that I suspect that if you have several thousands of records 
on your table it will become slow...

Best,
Oliveiros

SELECT SUM(tudo.parcela),tudo.a
FROM
(
SELECT fo.parcela,fo.a,fo.b,fo.c,MIN(th.c) as d
FROM
(
SELECT se.a as parcela,se.b as a,se.c as b, MAX(pr.c) as c
FROM
yourTable se
LEFT JOIN
(
SELECT a.*
FROM yourTable a
JOIN yourTable b
ON (b.b <> a.b)
AND ((age(a.c,b.c) = '1 day'::interval)

)
) pr
ON pr.b = se.b
AND    se.c >= pr.c
GROUP BY se.a,se.b,se.c
) fo
LEFT JOIN
(
SELECT a.*
FROM yourTable a
JOIN yourTable b
ON (b.b <> a.b)
AND ((age(a.c,b.c) = '-1 day'::interval)
)
) th
ON fo.a = th.b
AND fo.b <= th.c
GROUP BY fo.parcela,fo.a,fo.b,fo.c
) tudo
GROUP BY tudo.a,tudo.c,tudo.d




To: <pgsql-sql@postgresql.org>
Sent: Thursday, July 22, 2010 9:09 AM
Subject: [SQL] grouping subsets


> Hi,
>
> having a table similar to
>
> | 1 | B | [2010-07-15 Do] |
> | 1 | B | [2010-07-16 Fr] |
> |---+---+-----------------|
> | 2 | C | [2010-07-17 Sa] |
> | 2 | C | [2010-07-18 So] |
> |---+---+-----------------|
> | 1 | B | [2010-07-19 Mo] |
> | 1 | B | [2010-07-20 Di] |
> | 1 | B | [2010-07-21 Mi] |
> | 1 | B | [2010-07-22 Do] |
> |---+---+-----------------|
> | 3 | D | [2010-07-23 Fr] |
>
> a simple group by gives me:
>
> | 6 | B |
> | 4 | C |
> | 3 | D |
>
>
> What I want to get is the values grouped by "subset", where a subset is a 
> set of rows with identical column until the colum changes.
> Is there a way to get
>
> | 2 | B |
> | 4 | C |
> | 4 | B |
> | 3 | D |
>
> by SQL only?
>
> - Rainer
>
>
>
>
>
> -- 
> Sent via pgsql-sql mailing list (pgsql-sql@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-sql 




^ permalink  raw  reply  [nested|flat] 16+ messages in thread

* Re: grouping subsets
  2010-07-22 08:09 grouping subsets Rainer Stengele <rainer.stengele@diplan.de>
  2010-07-27 10:37 ` Re: grouping subsets Oliveiros d'Azevedo Cristina <oliveiros.cristina@marktest.pt>
@ 2010-07-29 09:41   ` Rainer Stengele <rainer.stengele@diplan.de>
  2010-07-29 11:47     ` Re: grouping subsets Oliveiros d'Azevedo Cristina <oliveiros.cristina@marktest.pt>
  0 siblings, 1 reply; 16+ messages in thread

From: Rainer Stengele @ 2010-07-29 09:41 UTC (permalink / raw)
  To: Oliveiros d'Azevedo Cristina <oliveiros.cristina@marktest.pt>; +Cc: pgsql-sql

Howdy Cristina,

unfortunately things are more complicated. I have inserted an excerpt of the real data here:

================================================================================
TableID         MasterID dtBegin                           dtEnd                              idR      idL      idB     consumption
4057312           295530 2010-07-01 00:59:21.077           2010-07-01 01:32:59.670           1726     3212     1428     279
4061043           295574 2010-07-01 01:59:31.137           2010-07-01 02:32:09.373           1726     3212     1428     183
4083397           295838 2010-07-01 07:57:51.327           2010-07-01 08:28:28.117           318      1846     1012     30
4090858           295920 2010-07-01 09:52:33.777           2010-07-01 10:31:34.393           318      1846     1012     487
4094589           295961 2010-07-01 10:47:59.370           2010-07-01 11:32:20.903           318      1846     1012     472
4098330           296013 2010-07-01 11:58:53.890           2010-07-01 12:31:35.730           318      1846     1012     195
4102069           296058 2010-07-01 12:36:19.170           2010-07-01 13:32:13.950           318      1846     1012     338
4105809           296102 2010-07-01 13:58:53.170           2010-07-01 14:02:57.710           318      1846     1012     105
4109555           296150 2010-07-01 14:59:11.663           2010-07-01 15:32:33.810           318      1846     1012     187
4113305           296194 2010-07-01 15:59:01.797           2010-07-01 16:02:27.260           318      1846     1012     108
4117048           296238 2010-07-01 16:20:47.997           2010-07-01 17:32:49.367           318      1846     1012     179
4120791           296282 2010-07-01 17:58:27.657           2010-07-01 18:29:01.733           318      1846     1012     256
4128291           296370 2010-07-01 19:54:17.687           2010-07-01 20:32:53.850           318      1846     1012     239
4132044           296413 2010-07-01 20:31:37.653           2010-07-01 21:29:13.497           318      1846     1012     39
4135797           296458 2010-07-01 21:59:13.983           2010-07-01 22:32:46.503           318      1846     1012     157
4139572           296506 2010-07-01 22:58:49.530           2010-07-01 23:32:22.543           318      1846     1012     218
4142941           296554 2010-07-01 23:59:13.857           2010-07-02 00:32:30.390           318      1846     1012     248
4146289           296598 2010-07-02 00:58:55.763           2010-07-02 01:32:41.983           318      1846     1012     204
4149616           296642 2010-07-02 01:46:57.357           2010-07-02 02:32:56.983           318      1846     1012     42
4152952           296686 2010-07-02 02:55:19.653           2010-07-02 03:32:28.013           318      1846     1012     135
4156289           296730 2010-07-02 03:43:52.777           2010-07-02 04:32:55.250           318      1846     1012     743
4159624           296774 2010-07-02 04:43:15.310           2010-07-02 05:32:44.547           318      1846     1012     277
4162961           296817 2010-07-02 05:58:59.483           2010-07-02 06:32:37.340           318      1846     1012     121
4166303           296862 2010-07-02 06:58:50.733           2010-07-02 07:32:39.113           318      1846     1012     239
4172981           296950 2010-07-02 07:28:55.293           2010-07-02 09:33:01.200           318      1846     1012     512
4176322           296993 2010-07-02 09:59:04.607           2010-07-02 10:33:01.903           318      1846     1012     139
4179667           297038 2010-07-02 10:55:27.760           2010-07-02 11:32:56.560           318      1846     1012     722
4183012           297082 2010-07-02 11:59:33.650           2010-07-02 12:32:14.700            318      1846     1012     163
4186351           297126 2010-07-02 12:23:45.997           2010-07-02 13:32:59.500            318      1846     1012     284
4189689           297169 2010-07-02 13:44:21.253           2010-07-02 14:18:05.080            318      1846     1012     254
4196371           297258 2010-07-02 16:16:19.123           2010-07-02 16:32:53.437           1706     3541     1511     161
4199720           297301 2010-07-02 16:59:35.127           2010-07-02 17:32:57.950           1706     3541     1511     250
4203068           297346 2010-07-02 17:59:34.027           2010-07-02 18:32:54.337           1706     3541     1511     302
4206413           297389 2010-07-02 18:59:28.730           2010-07-02 19:32:37.950           1706     3541     1511     276
4209758           297434 2010-07-02 19:54:00.243           2010-07-02 20:32:57.433           1706     3541     1511     209
4213102           297473 2010-07-02 20:49:10.963           2010-07-02 21:30:44.540           1706     3541     1511     76
4216447           297511 2010-07-02 21:59:34.810           2010-07-02 22:33:00.603           1706     3541     1511     287
4219818           297569 2010-07-02 22:56:52.750           2010-07-02 23:59:31.607           1706     3541     1511     1877
4219819           297570 2010-07-02 23:59:21.577           2010-07-03 00:54:40.153           1706     3541     1511     1798
4219821           297572 2010-07-03 00:48:03.310           2010-07-03 01:59:37.920           1706     3541     1511     1125
4219823           297574 2010-07-03 01:51:01.057           2010-07-03 02:59:45.433           1706     3541     1511     1629
4219820           297571 2010-07-03 02:59:29.393           2010-07-03 03:59:54.920           1706     3541     1511     2462
4219822           297573 2010-07-03 03:59:18.663           2010-07-03 04:01:48.810           1706     3541     1511     70
4225738           297656 2010-07-03 06:13:34.980           2010-07-03 06:28:09.697           1726     3212     1428     46
4228694           297695 2010-07-03 06:59:15.560           2010-07-03 07:32:45.653           1726     3212     1428     251
4231649           297733 2010-07-03 07:59:11.937           2010-07-03 08:32:57.217           1726     3212     1428     284
4234604           297771 2010-07-03 08:57:00.357           2010-07-03 09:32:47.903           1726     3212     1428     227
4237559           297809 2010-07-03 09:59:19.813           2010-07-03 10:33:02.063           1726     3212     1428     285
4261156           298596 2010-07-04 22:59:09.863           2010-07-04 23:33:45.530           1726     3212     1428     1286
4264114           298646 2010-07-04 23:59:16.967           2010-07-05 00:33:08.107           1726     3212     1428     297
4267067           298690 2010-07-05 00:59:15.187           2010-07-05 01:32:48.300           1726     3212     1428     333
4270023           298734 2010-07-05 01:59:02.497           2010-07-05 02:32:48.780           1726     3212     1428     270
4272977           298778 2010-07-05 02:41:43.737           2010-07-05 03:32:56.043           1726     3212     1428     317
4275927           298822 2010-07-05 03:59:17.027           2010-07-05 04:33:14.947           1726     3212     1428     1623
================================================================================

Description:
1. Column: some ID
2. Column: reference to another table
3. and 4. column: timestamp from/to of the item
5. Column: ID R
6. Column: ID L
7. Column: ID B
8. Column: Sum of components

Requirement:
Sum over all components (from column 8) for each combination of ID R, ID L, ID B, but (!)
rows with same keys (R,L,B) should be summed up only until the keys change.
Do not sum up the components for identical keys, if there are other keys between them.

Example result:

idR       idL      idB                 SUM
1726     3212     1428                 462
 318     1846     1012                 ...
1706     3541     1511                 ...
1726     3212     1428                 ...


Note that the first and last entry here has the same keys

Maybe you find a similar monster SQL solving such a requirement.
Thanks for considering!

Rainer



Am 27.07.2010 12:37, schrieb Oliveiros d'Azevedo Cristina:
> Howdy, Rainer.
> 
> It's been a while, so I don't know if you are still interested in this problem or if you, in the meantime, found yourself a solution,
> but I've tried this on a local copy of the example you provided   and it seems to work.
> 
> The problem is that I suspect that if you have several thousands of records on your table it will become slow...
> 
> Best,
> Oliveiros
> 
> SELECT SUM(tudo.parcela),tudo.a
> FROM
> (
> SELECT fo.parcela,fo.a,fo.b,fo.c,MIN(th.c) as d
> FROM
> (
> SELECT se.a as parcela,se.b as a,se.c as b, MAX(pr.c) as c
> FROM
> yourTable se
> LEFT JOIN
> (
> SELECT a.*
> FROM yourTable a
> JOIN yourTable b
> ON (b.b <> a.b)
> AND ((age(a.c,b.c) = '1 day'::interval)
> 
> )
> ) pr
> ON pr.b = se.b
> AND    se.c >= pr.c
> GROUP BY se.a,se.b,se.c
> ) fo
> LEFT JOIN
> (
> SELECT a.*
> FROM yourTable a
> JOIN yourTable b
> ON (b.b <> a.b)
> AND ((age(a.c,b.c) = '-1 day'::interval)
> )
> ) th
> ON fo.a = th.b
> AND fo.b <= th.c
> GROUP BY fo.parcela,fo.a,fo.b,fo.c
> ) tudo
> GROUP BY tudo.a,tudo.c,tudo.d
> 
> 
> 
> 
> To: <pgsql-sql@postgresql.org>
> Sent: Thursday, July 22, 2010 9:09 AM
> Subject: [SQL] grouping subsets
> 
> 
>> Hi,
>>
>> having a table similar to
>>
>> | 1 | B | [2010-07-15 Do] |
>> | 1 | B | [2010-07-16 Fr] |
>> |---+---+-----------------|
>> | 2 | C | [2010-07-17 Sa] |
>> | 2 | C | [2010-07-18 So] |
>> |---+---+-----------------|
>> | 1 | B | [2010-07-19 Mo] |
>> | 1 | B | [2010-07-20 Di] |
>> | 1 | B | [2010-07-21 Mi] |
>> | 1 | B | [2010-07-22 Do] |
>> |---+---+-----------------|
>> | 3 | D | [2010-07-23 Fr] |
>>
>> a simple group by gives me:
>>
>> | 6 | B |
>> | 4 | C |
>> | 3 | D |
>>
>>
>> What I want to get is the values grouped by "subset", where a subset is a set of rows with identical column until the colum changes.
>> Is there a way to get
>>
>> | 2 | B |
>> | 4 | C |
>> | 4 | B |
>> | 3 | D |
>>
>> by SQL only?
>>
>> - Rainer
>>
>>
>>
>>
>>
>> -- 
>> Sent via pgsql-sql mailing list (pgsql-sql@postgresql.org)
>> To make changes to your subscription:
>> http://www.postgresql.org/mailpref/pgsql-sql 
> 
> 




^ permalink  raw  reply  [nested|flat] 16+ messages in thread

* Re: grouping subsets
  2010-07-22 08:09 grouping subsets Rainer Stengele <rainer.stengele@diplan.de>
  2010-07-27 10:37 ` Re: grouping subsets Oliveiros d'Azevedo Cristina <oliveiros.cristina@marktest.pt>
  2010-07-29 09:41   ` Re: grouping subsets Rainer Stengele <rainer.stengele@diplan.de>
@ 2010-07-29 11:47     ` Oliveiros d'Azevedo Cristina <oliveiros.cristina@marktest.pt>
  2010-07-29 12:10       ` Re: grouping subsets Rainer Stengele <rainer.stengele@diplan.de>
  0 siblings, 1 reply; 16+ messages in thread

From: Oliveiros d'Azevedo Cristina @ 2010-07-29 11:47 UTC (permalink / raw)
  To: Rainer Stengele <rainer.stengele@diplan.de>; +Cc: pgsql-sql

Yes. This is somewhat more complicated because it has more constraints.
I've noticed that a given combination doesn't appear with holes on a certain 
day.

For ex, on a daily basis, we have every three key combinations together.

We dont have things like
2010-7-01  1726 3212 1428
2010-7-01  1726 3212 1428
...                318   1846 1012
2010-7-01  1726 3212 1428

Can I assume that, for a certain day , the records for the same three 
combination are all together? There is just one set per day for a given 
combination?

Or is it possible to have the same combination on one day with several sets?

Best,
Oliveiros


----- Original Message ----- 
From: "Rainer Stengele" <rainer.stengele@diplan.de>
Newsgroups: gmane.comp.db.postgresql.sql
To: "Oliveiros d'Azevedo Cristina" <oliveiros.cristina@marktest.pt>
Cc: <>
Sent: Thursday, July 29, 2010 10:41 AM
Subject: Re: grouping subsets


> Howdy Cristina,
>
> unfortunately things are more complicated. I have inserted an excerpt of 
> the real data here:
>
> ================================================================================
> TableID         MasterID dtBegin                           dtEnd 
> idR      idL      idB     consumption
> 4057312           295530 2010-07-01 00:59:21.077           2010-07-01 
> 01:32:59.670           1726     3212     1428     279
> 4061043           295574 2010-07-01 01:59:31.137           2010-07-01 
> 02:32:09.373           1726     3212     1428     183
> 4083397           295838 2010-07-01 07:57:51.327           2010-07-01 
> 08:28:28.117           318      1846     1012     30
> 4090858           295920 2010-07-01 09:52:33.777           2010-07-01 
> 10:31:34.393           318      1846     1012     487
> 4094589           295961 2010-07-01 10:47:59.370           2010-07-01 
> 11:32:20.903           318      1846     1012     472
> 4098330           296013 2010-07-01 11:58:53.890           2010-07-01 
> 12:31:35.730           318      1846     1012     195
> 4102069           296058 2010-07-01 12:36:19.170           2010-07-01 
> 13:32:13.950           318      1846     1012     338
> 4105809           296102 2010-07-01 13:58:53.170           2010-07-01 
> 14:02:57.710           318      1846     1012     105
> 4109555           296150 2010-07-01 14:59:11.663           2010-07-01 
> 15:32:33.810           318      1846     1012     187
> 4113305           296194 2010-07-01 15:59:01.797           2010-07-01 
> 16:02:27.260           318      1846     1012     108
> 4117048           296238 2010-07-01 16:20:47.997           2010-07-01 
> 17:32:49.367           318      1846     1012     179
> 4120791           296282 2010-07-01 17:58:27.657           2010-07-01 
> 18:29:01.733           318      1846     1012     256
> 4128291           296370 2010-07-01 19:54:17.687           2010-07-01 
> 20:32:53.850           318      1846     1012     239
> 4132044           296413 2010-07-01 20:31:37.653           2010-07-01 
> 21:29:13.497           318      1846     1012     39
> 4135797           296458 2010-07-01 21:59:13.983           2010-07-01 
> 22:32:46.503           318      1846     1012     157
> 4139572           296506 2010-07-01 22:58:49.530           2010-07-01 
> 23:32:22.543           318      1846     1012     218
> 4142941           296554 2010-07-01 23:59:13.857           2010-07-02 
> 00:32:30.390           318      1846     1012     248
> 4146289           296598 2010-07-02 00:58:55.763           2010-07-02 
> 01:32:41.983           318      1846     1012     204
> 4149616           296642 2010-07-02 01:46:57.357           2010-07-02 
> 02:32:56.983           318      1846     1012     42
> 4152952           296686 2010-07-02 02:55:19.653           2010-07-02 
> 03:32:28.013           318      1846     1012     135
> 4156289           296730 2010-07-02 03:43:52.777           2010-07-02 
> 04:32:55.250           318      1846     1012     743
> 4159624           296774 2010-07-02 04:43:15.310           2010-07-02 
> 05:32:44.547           318      1846     1012     277
> 4162961           296817 2010-07-02 05:58:59.483           2010-07-02 
> 06:32:37.340           318      1846     1012     121
> 4166303           296862 2010-07-02 06:58:50.733           2010-07-02 
> 07:32:39.113           318      1846     1012     239
> 4172981           296950 2010-07-02 07:28:55.293           2010-07-02 
> 09:33:01.200           318      1846     1012     512
> 4176322           296993 2010-07-02 09:59:04.607           2010-07-02 
> 10:33:01.903           318      1846     1012     139
> 4179667           297038 2010-07-02 10:55:27.760           2010-07-02 
> 11:32:56.560           318      1846     1012     722
> 4183012           297082 2010-07-02 11:59:33.650           2010-07-02 
> 12:32:14.700            318      1846     1012     163
> 4186351           297126 2010-07-02 12:23:45.997           2010-07-02 
> 13:32:59.500            318      1846     1012     284
> 4189689           297169 2010-07-02 13:44:21.253           2010-07-02 
> 14:18:05.080            318      1846     1012     254
> 4196371           297258 2010-07-02 16:16:19.123           2010-07-02 
> 16:32:53.437           1706     3541     1511     161
> 4199720           297301 2010-07-02 16:59:35.127           2010-07-02 
> 17:32:57.950           1706     3541     1511     250
> 4203068           297346 2010-07-02 17:59:34.027           2010-07-02 
> 18:32:54.337           1706     3541     1511     302
> 4206413           297389 2010-07-02 18:59:28.730           2010-07-02 
> 19:32:37.950           1706     3541     1511     276
> 4209758           297434 2010-07-02 19:54:00.243           2010-07-02 
> 20:32:57.433           1706     3541     1511     209
> 4213102           297473 2010-07-02 20:49:10.963           2010-07-02 
> 21:30:44.540           1706     3541     1511     76
> 4216447           297511 2010-07-02 21:59:34.810           2010-07-02 
> 22:33:00.603           1706     3541     1511     287
> 4219818           297569 2010-07-02 22:56:52.750           2010-07-02 
> 23:59:31.607           1706     3541     1511     1877
> 4219819           297570 2010-07-02 23:59:21.577           2010-07-03 
> 00:54:40.153           1706     3541     1511     1798
> 4219821           297572 2010-07-03 00:48:03.310           2010-07-03 
> 01:59:37.920           1706     3541     1511     1125
> 4219823           297574 2010-07-03 01:51:01.057           2010-07-03 
> 02:59:45.433           1706     3541     1511     1629
> 4219820           297571 2010-07-03 02:59:29.393           2010-07-03 
> 03:59:54.920           1706     3541     1511     2462
> 4219822           297573 2010-07-03 03:59:18.663           2010-07-03 
> 04:01:48.810           1706     3541     1511     70
> 4225738           297656 2010-07-03 06:13:34.980           2010-07-03 
> 06:28:09.697           1726     3212     1428     46
> 4228694           297695 2010-07-03 06:59:15.560           2010-07-03 
> 07:32:45.653           1726     3212     1428     251
> 4231649           297733 2010-07-03 07:59:11.937           2010-07-03 
> 08:32:57.217           1726     3212     1428     284
> 4234604           297771 2010-07-03 08:57:00.357           2010-07-03 
> 09:32:47.903           1726     3212     1428     227
> 4237559           297809 2010-07-03 09:59:19.813           2010-07-03 
> 10:33:02.063           1726     3212     1428     285
> 4261156           298596 2010-07-04 22:59:09.863           2010-07-04 
> 23:33:45.530           1726     3212     1428     1286
> 4264114           298646 2010-07-04 23:59:16.967           2010-07-05 
> 00:33:08.107           1726     3212     1428     297
> 4267067           298690 2010-07-05 00:59:15.187           2010-07-05 
> 01:32:48.300           1726     3212     1428     333
> 4270023           298734 2010-07-05 01:59:02.497           2010-07-05 
> 02:32:48.780           1726     3212     1428     270
> 4272977           298778 2010-07-05 02:41:43.737           2010-07-05 
> 03:32:56.043           1726     3212     1428     317
> 4275927           298822 2010-07-05 03:59:17.027           2010-07-05 
> 04:33:14.947           1726     3212     1428     1623
> ================================================================================
>
> Description:
> 1. Column: some ID
> 2. Column: reference to another table
> 3. and 4. column: timestamp from/to of the item
> 5. Column: ID R
> 6. Column: ID L
> 7. Column: ID B
> 8. Column: Sum of components
>
> Requirement:
> Sum over all components (from column 8) for each combination of ID R, ID 
> L, ID B, but (!)
> rows with same keys (R,L,B) should be summed up only until the keys 
> change.
> Do not sum up the components for identical keys, if there are other keys 
> between them.
>
> Example result:
>
> idR       idL      idB                 SUM
> 1726     3212     1428                 462
> 318     1846     1012                 ...
> 1706     3541     1511                 ...
> 1726     3212     1428                 ...
>
>
> Note that the first and last entry here has the same keys
>
> Maybe you find a similar monster SQL solving such a requirement.
> Thanks for considering!
>
> Rainer
>
>
>
> Am 27.07.2010 12:37, schrieb Oliveiros d'Azevedo Cristina:
>> Howdy, Rainer.
>>
>> It's been a while, so I don't know if you are still interested in this 
>> problem or if you, in the meantime, found yourself a solution,
>> but I've tried this on a local copy of the example you provided   and it 
>> seems to work.
>>
>> The problem is that I suspect that if you have several thousands of 
>> records on your table it will become slow...
>>
>> Best,
>> Oliveiros
>>
>> SELECT SUM(tudo.parcela),tudo.a
>> FROM
>> (
>> SELECT fo.parcela,fo.a,fo.b,fo.c,MIN(th.c) as d
>> FROM
>> (
>> SELECT se.a as parcela,se.b as a,se.c as b, MAX(pr.c) as c
>> FROM
>> yourTable se
>> LEFT JOIN
>> (
>> SELECT a.*
>> FROM yourTable a
>> JOIN yourTable b
>> ON (b.b <> a.b)
>> AND ((age(a.c,b.c) = '1 day'::interval)
>>
>> )
>> ) pr
>> ON pr.b = se.b
>> AND    se.c >= pr.c
>> GROUP BY se.a,se.b,se.c
>> ) fo
>> LEFT JOIN
>> (
>> SELECT a.*
>> FROM yourTable a
>> JOIN yourTable b
>> ON (b.b <> a.b)
>> AND ((age(a.c,b.c) = '-1 day'::interval)
>> )
>> ) th
>> ON fo.a = th.b
>> AND fo.b <= th.c
>> GROUP BY fo.parcela,fo.a,fo.b,fo.c
>> ) tudo
>> GROUP BY tudo.a,tudo.c,tudo.d
>>
>>
>>
>>
>> To: <pgsql-sql@postgresql.org>
>> Sent: Thursday, July 22, 2010 9:09 AM
>> Subject: [SQL] grouping subsets
>>
>>
>>> Hi,
>>>
>>> having a table similar to
>>>
>>> | 1 | B | [2010-07-15 Do] |
>>> | 1 | B | [2010-07-16 Fr] |
>>> |---+---+-----------------|
>>> | 2 | C | [2010-07-17 Sa] |
>>> | 2 | C | [2010-07-18 So] |
>>> |---+---+-----------------|
>>> | 1 | B | [2010-07-19 Mo] |
>>> | 1 | B | [2010-07-20 Di] |
>>> | 1 | B | [2010-07-21 Mi] |
>>> | 1 | B | [2010-07-22 Do] |
>>> |---+---+-----------------|
>>> | 3 | D | [2010-07-23 Fr] |
>>>
>>> a simple group by gives me:
>>>
>>> | 6 | B |
>>> | 4 | C |
>>> | 3 | D |
>>>
>>>
>>> What I want to get is the values grouped by "subset", where a subset is 
>>> a set of rows with identical column until the colum changes.
>>> Is there a way to get
>>>
>>> | 2 | B |
>>> | 4 | C |
>>> | 4 | B |
>>> | 3 | D |
>>>
>>> by SQL only?
>>>
>>> - Rainer
>>>
>>>
>>>
>>>
>>>
>>> -- 
>>> Sent via pgsql-sql mailing list (pgsql-sql@postgresql.org)
>>> To make changes to your subscription:
>>> http://www.postgresql.org/mailpref/pgsql-sql
>>
>> 




^ permalink  raw  reply  [nested|flat] 16+ messages in thread

* Re: grouping subsets
  2010-07-22 08:09 grouping subsets Rainer Stengele <rainer.stengele@diplan.de>
  2010-07-27 10:37 ` Re: grouping subsets Oliveiros d'Azevedo Cristina <oliveiros.cristina@marktest.pt>
  2010-07-29 09:41   ` Re: grouping subsets Rainer Stengele <rainer.stengele@diplan.de>
  2010-07-29 11:47     ` Re: grouping subsets Oliveiros d'Azevedo Cristina <oliveiros.cristina@marktest.pt>
@ 2010-07-29 12:10       ` Rainer Stengele <rainer.stengele@diplan.de>
  2010-07-29 13:31         ` Re: grouping subsets Oliveiros d'Azevedo Cristina <oliveiros.cristina@marktest.pt>
  0 siblings, 1 reply; 16+ messages in thread

From: Rainer Stengele @ 2010-07-29 12:10 UTC (permalink / raw)
  To: Oliveiros d'Azevedo Cristina <oliveiros.cristina@marktest.pt>; +Cc: pgsql-sql

 No. This is by accident.
We have to assume that the combinations do change anytime, and many times per day.

So

"Or is it possible to have the same combination on one day with several sets?"

YES!

Rainer



Am 29.07.2010 13:47, schrieb Oliveiros d'Azevedo Cristina:
> Yes. This is somewhat more complicated because it has more constraints.
> I've noticed that a given combination doesn't appear with holes on a certain day.
>
> For ex, on a daily basis, we have every three key combinations together.
>
> We dont have things like
> 2010-7-01  1726 3212 1428
> 2010-7-01  1726 3212 1428
> ...                318   1846 1012
> 2010-7-01  1726 3212 1428
>
> Can I assume that, for a certain day , the records for the same three combination are all together? There is just one set per day for a given combination?
>
> Or is it possible to have the same combination on one day with several sets?
>
> Best,
> Oliveiros
>
>
> ----- Original Message ----- From: "Rainer Stengele" <rainer.stengele@diplan.de>
> Newsgroups: gmane.comp.db.postgresql.sql
> To: "Oliveiros d'Azevedo Cristina" <oliveiros.cristina@marktest.pt>
> Cc: <>
> Sent: Thursday, July 29, 2010 10:41 AM
> Subject: Re: grouping subsets
>
>
>> Howdy Cristina,
>>
>> unfortunately things are more complicated. I have inserted an excerpt of the real data here:
>>
>> ================================================================================
>> TableID         MasterID dtBegin                           dtEnd idR      idL      idB     consumption
>> 4057312           295530 2010-07-01 00:59:21.077           2010-07-01 01:32:59.670           1726     3212     1428     279
>> 4061043           295574 2010-07-01 01:59:31.137           2010-07-01 02:32:09.373           1726     3212     1428     183
>> 4083397           295838 2010-07-01 07:57:51.327           2010-07-01 08:28:28.117           318      1846     1012     30
>> 4090858           295920 2010-07-01 09:52:33.777           2010-07-01 10:31:34.393           318      1846     1012     487
>> 4094589           295961 2010-07-01 10:47:59.370           2010-07-01 11:32:20.903           318      1846     1012     472
>> 4098330           296013 2010-07-01 11:58:53.890           2010-07-01 12:31:35.730           318      1846     1012     195
>> 4102069           296058 2010-07-01 12:36:19.170           2010-07-01 13:32:13.950           318      1846     1012     338
>> 4105809           296102 2010-07-01 13:58:53.170           2010-07-01 14:02:57.710           318      1846     1012     105
>> 4109555           296150 2010-07-01 14:59:11.663           2010-07-01 15:32:33.810           318      1846     1012     187
>> 4113305           296194 2010-07-01 15:59:01.797           2010-07-01 16:02:27.260           318      1846     1012     108
>> 4117048           296238 2010-07-01 16:20:47.997           2010-07-01 17:32:49.367           318      1846     1012     179
>> 4120791           296282 2010-07-01 17:58:27.657           2010-07-01 18:29:01.733           318      1846     1012     256
>> 4128291           296370 2010-07-01 19:54:17.687           2010-07-01 20:32:53.850           318      1846     1012     239
>> 4132044           296413 2010-07-01 20:31:37.653           2010-07-01 21:29:13.497           318      1846     1012     39
>> 4135797           296458 2010-07-01 21:59:13.983           2010-07-01 22:32:46.503           318      1846     1012     157
>> 4139572           296506 2010-07-01 22:58:49.530           2010-07-01 23:32:22.543           318      1846     1012     218
>> 4142941           296554 2010-07-01 23:59:13.857           2010-07-02 00:32:30.390           318      1846     1012     248
>> 4146289           296598 2010-07-02 00:58:55.763           2010-07-02 01:32:41.983           318      1846     1012     204
>> 4149616           296642 2010-07-02 01:46:57.357           2010-07-02 02:32:56.983           318      1846     1012     42
>> 4152952           296686 2010-07-02 02:55:19.653           2010-07-02 03:32:28.013           318      1846     1012     135
>> 4156289           296730 2010-07-02 03:43:52.777           2010-07-02 04:32:55.250           318      1846     1012     743
>> 4159624           296774 2010-07-02 04:43:15.310           2010-07-02 05:32:44.547           318      1846     1012     277
>> 4162961           296817 2010-07-02 05:58:59.483           2010-07-02 06:32:37.340           318      1846     1012     121
>> 4166303           296862 2010-07-02 06:58:50.733           2010-07-02 07:32:39.113           318      1846     1012     239
>> 4172981           296950 2010-07-02 07:28:55.293           2010-07-02 09:33:01.200           318      1846     1012     512
>> 4176322           296993 2010-07-02 09:59:04.607           2010-07-02 10:33:01.903           318      1846     1012     139
>> 4179667           297038 2010-07-02 10:55:27.760           2010-07-02 11:32:56.560           318      1846     1012     722
>> 4183012           297082 2010-07-02 11:59:33.650           2010-07-02 12:32:14.700            318      1846     1012     163
>> 4186351           297126 2010-07-02 12:23:45.997           2010-07-02 13:32:59.500            318      1846     1012     284
>> 4189689           297169 2010-07-02 13:44:21.253           2010-07-02 14:18:05.080            318      1846     1012     254
>> 4196371           297258 2010-07-02 16:16:19.123           2010-07-02 16:32:53.437           1706     3541     1511     161
>> 4199720           297301 2010-07-02 16:59:35.127           2010-07-02 17:32:57.950           1706     3541     1511     250
>> 4203068           297346 2010-07-02 17:59:34.027           2010-07-02 18:32:54.337           1706     3541     1511     302
>> 4206413           297389 2010-07-02 18:59:28.730           2010-07-02 19:32:37.950           1706     3541     1511     276
>> 4209758           297434 2010-07-02 19:54:00.243           2010-07-02 20:32:57.433           1706     3541     1511     209
>> 4213102           297473 2010-07-02 20:49:10.963           2010-07-02 21:30:44.540           1706     3541     1511     76
>> 4216447           297511 2010-07-02 21:59:34.810           2010-07-02 22:33:00.603           1706     3541     1511     287
>> 4219818           297569 2010-07-02 22:56:52.750           2010-07-02 23:59:31.607           1706     3541     1511     1877
>> 4219819           297570 2010-07-02 23:59:21.577           2010-07-03 00:54:40.153           1706     3541     1511     1798
>> 4219821           297572 2010-07-03 00:48:03.310           2010-07-03 01:59:37.920           1706     3541     1511     1125
>> 4219823           297574 2010-07-03 01:51:01.057           2010-07-03 02:59:45.433           1706     3541     1511     1629
>> 4219820           297571 2010-07-03 02:59:29.393           2010-07-03 03:59:54.920           1706     3541     1511     2462
>> 4219822           297573 2010-07-03 03:59:18.663           2010-07-03 04:01:48.810           1706     3541     1511     70
>> 4225738           297656 2010-07-03 06:13:34.980           2010-07-03 06:28:09.697           1726     3212     1428     46
>> 4228694           297695 2010-07-03 06:59:15.560           2010-07-03 07:32:45.653           1726     3212     1428     251
>> 4231649           297733 2010-07-03 07:59:11.937           2010-07-03 08:32:57.217           1726     3212     1428     284
>> 4234604           297771 2010-07-03 08:57:00.357           2010-07-03 09:32:47.903           1726     3212     1428     227
>> 4237559           297809 2010-07-03 09:59:19.813           2010-07-03 10:33:02.063           1726     3212     1428     285
>> 4261156           298596 2010-07-04 22:59:09.863           2010-07-04 23:33:45.530           1726     3212     1428     1286
>> 4264114           298646 2010-07-04 23:59:16.967           2010-07-05 00:33:08.107           1726     3212     1428     297
>> 4267067           298690 2010-07-05 00:59:15.187           2010-07-05 01:32:48.300           1726     3212     1428     333
>> 4270023           298734 2010-07-05 01:59:02.497           2010-07-05 02:32:48.780           1726     3212     1428     270
>> 4272977           298778 2010-07-05 02:41:43.737           2010-07-05 03:32:56.043           1726     3212     1428     317
>> 4275927           298822 2010-07-05 03:59:17.027           2010-07-05 04:33:14.947           1726     3212     1428     1623
>> ================================================================================
>>
>> Description:
>> 1. Column: some ID
>> 2. Column: reference to another table
>> 3. and 4. column: timestamp from/to of the item
>> 5. Column: ID R
>> 6. Column: ID L
>> 7. Column: ID B
>> 8. Column: Sum of components
>>
>> Requirement:
>> Sum over all components (from column 8) for each combination of ID R, ID L, ID B, but (!)
>> rows with same keys (R,L,B) should be summed up only until the keys change.
>> Do not sum up the components for identical keys, if there are other keys between them.
>>
>> Example result:
>>
>> idR       idL      idB                 SUM
>> 1726     3212     1428                 462
>> 318     1846     1012                 ...
>> 1706     3541     1511                 ...
>> 1726     3212     1428                 ...
>>
>>
>> Note that the first and last entry here has the same keys
>>
>> Maybe you find a similar monster SQL solving such a requirement.
>> Thanks for considering!
>>
>> Rainer
>>
>>
>>
>> Am 27.07.2010 12:37, schrieb Oliveiros d'Azevedo Cristina:
>>> Howdy, Rainer.
>>>
>>> It's been a while, so I don't know if you are still interested in this problem or if you, in the meantime, found yourself a solution,
>>> but I've tried this on a local copy of the example you provided   and it seems to work.
>>>
>>> The problem is that I suspect that if you have several thousands of records on your table it will become slow...
>>>
>>> Best,
>>> Oliveiros
>>>
>>> SELECT SUM(tudo.parcela),tudo.a
>>> FROM
>>> (
>>> SELECT fo.parcela,fo.a,fo.b,fo.c,MIN(th.c) as d
>>> FROM
>>> (
>>> SELECT se.a as parcela,se.b as a,se.c as b, MAX(pr.c) as c
>>> FROM
>>> yourTable se
>>> LEFT JOIN
>>> (
>>> SELECT a.*
>>> FROM yourTable a
>>> JOIN yourTable b
>>> ON (b.b <> a.b)
>>> AND ((age(a.c,b.c) = '1 day'::interval)
>>>
>>> )
>>> ) pr
>>> ON pr.b = se.b
>>> AND    se.c >= pr.c
>>> GROUP BY se.a,se.b,se.c
>>> ) fo
>>> LEFT JOIN
>>> (
>>> SELECT a.*
>>> FROM yourTable a
>>> JOIN yourTable b
>>> ON (b.b <> a.b)
>>> AND ((age(a.c,b.c) = '-1 day'::interval)
>>> )
>>> ) th
>>> ON fo.a = th.b
>>> AND fo.b <= th.c
>>> GROUP BY fo.parcela,fo.a,fo.b,fo.c
>>> ) tudo
>>> GROUP BY tudo.a,tudo.c,tudo.d
>>>
>>>
>>>
>>>
>>> To: <pgsql-sql@postgresql.org>
>>> Sent: Thursday, July 22, 2010 9:09 AM
>>> Subject: [SQL] grouping subsets
>>>
>>>
>>>> Hi,
>>>>
>>>> having a table similar to
>>>>
>>>> | 1 | B | [2010-07-15 Do] |
>>>> | 1 | B | [2010-07-16 Fr] |
>>>> |---+---+-----------------|
>>>> | 2 | C | [2010-07-17 Sa] |
>>>> | 2 | C | [2010-07-18 So] |
>>>> |---+---+-----------------|
>>>> | 1 | B | [2010-07-19 Mo] |
>>>> | 1 | B | [2010-07-20 Di] |
>>>> | 1 | B | [2010-07-21 Mi] |
>>>> | 1 | B | [2010-07-22 Do] |
>>>> |---+---+-----------------|
>>>> | 3 | D | [2010-07-23 Fr] |
>>>>
>>>> a simple group by gives me:
>>>>
>>>> | 6 | B |
>>>> | 4 | C |
>>>> | 3 | D |
>>>>
>>>>
>>>> What I want to get is the values grouped by "subset", where a subset is a set of rows with identical column until the colum changes.
>>>> Is there a way to get
>>>>
>>>> | 2 | B |
>>>> | 4 | C |
>>>> | 4 | B |
>>>> | 3 | D |
>>>>
>>>> by SQL only?
>>>>
>>>> - Rainer
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> -- 
>>>> Sent via pgsql-sql mailing list (pgsql-sql@postgresql.org)
>>>> To make changes to your subscription:
>>>> http://www.postgresql.org/mailpref/pgsql-sql
>>>
>>>
>



^ permalink  raw  reply  [nested|flat] 16+ messages in thread

* Re: grouping subsets
  2010-07-22 08:09 grouping subsets Rainer Stengele <rainer.stengele@diplan.de>
  2010-07-27 10:37 ` Re: grouping subsets Oliveiros d'Azevedo Cristina <oliveiros.cristina@marktest.pt>
  2010-07-29 09:41   ` Re: grouping subsets Rainer Stengele <rainer.stengele@diplan.de>
  2010-07-29 11:47     ` Re: grouping subsets Oliveiros d'Azevedo Cristina <oliveiros.cristina@marktest.pt>
  2010-07-29 12:10       ` Re: grouping subsets Rainer Stengele <rainer.stengele@diplan.de>
@ 2010-07-29 13:31         ` Oliveiros d'Azevedo Cristina <oliveiros.cristina@marktest.pt>
  2010-07-30 09:35           ` Re: grouping subsets Rainer Stengele <rainer.stengele@diplan.de>
  0 siblings, 1 reply; 16+ messages in thread

From: Oliveiros d'Azevedo Cristina @ 2010-07-29 13:31 UTC (permalink / raw)
  To: Rainer Stengele <rainer.stengele@diplan.de>; +Cc: pgsql-sql

Fine.

Please advice me,

How long can
your table be? Thousands? Millions of records?

Do you really need it in pure SQL
?

It seems to me that it might be possible, I'm just affraid that the query 
would become too complex and thus slow...

Best,
Oliveiros

----- Original Message ----- 
From: "Rainer Stengele" <rainer.stengele@diplan.de>
To: "Oliveiros d'Azevedo Cristina" <oliveiros.cristina@marktest.pt>
Cc: <pgsql-sql@postgresql.org>
Sent: Thursday, July 29, 2010 1:10 PM
Subject: Re: grouping subsets


> No. This is by accident.
> We have to assume that the combinations do change anytime, and many times 
> per day.
>
> So
>
> "Or is it possible to have the same combination on one day with several 
> sets?"
>
> YES!
>
> Rainer
>
>
>
> Am 29.07.2010 13:47, schrieb Oliveiros d'Azevedo Cristina:
>> Yes. This is somewhat more complicated because it has more constraints.
>> I've noticed that a given combination doesn't appear with holes on a 
>> certain day.
>>
>> For ex, on a daily basis, we have every three key combinations together.
>>
>> We dont have things like
>> 2010-7-01  1726 3212 1428
>> 2010-7-01  1726 3212 1428
>> ...                318   1846 1012
>> 2010-7-01  1726 3212 1428
>>
>> Can I assume that, for a certain day , the records for the same three 
>> combination are all together? There is just one set per day for a given 
>> combination?
>>
>> Or is it possible to have the same combination on one day with several 
>> sets?
>>
>> Best,
>> Oliveiros
>>
>>
>> ----- Original Message ----- From: "Rainer Stengele" 
>> <rainer.stengele@diplan.de>
>> Newsgroups: gmane.comp.db.postgresql.sql
>> To: "Oliveiros d'Azevedo Cristina" <oliveiros.cristina@marktest.pt>
>> Cc: <>
>> Sent: Thursday, July 29, 2010 10:41 AM
>> Subject: Re: grouping subsets
>>
>>
>>> Howdy Cristina,
>>>
>>> unfortunately things are more complicated. I have inserted an excerpt of 
>>> the real data here:
>>>
>>> ================================================================================
>>> TableID         MasterID dtBegin                           dtEnd idR 
>>> idL      idB     consumption
>>> 4057312           295530 2010-07-01 00:59:21.077           2010-07-01 
>>> 01:32:59.670           1726     3212     1428     279
>>> 4061043           295574 2010-07-01 01:59:31.137           2010-07-01 
>>> 02:32:09.373           1726     3212     1428     183
>>> 4083397           295838 2010-07-01 07:57:51.327           2010-07-01 
>>> 08:28:28.117           318      1846     1012     30
>>> 4090858           295920 2010-07-01 09:52:33.777           2010-07-01 
>>> 10:31:34.393           318      1846     1012     487
>>> 4094589           295961 2010-07-01 10:47:59.370           2010-07-01 
>>> 11:32:20.903           318      1846     1012     472
>>> 4098330           296013 2010-07-01 11:58:53.890           2010-07-01 
>>> 12:31:35.730           318      1846     1012     195
>>> 4102069           296058 2010-07-01 12:36:19.170           2010-07-01 
>>> 13:32:13.950           318      1846     1012     338
>>> 4105809           296102 2010-07-01 13:58:53.170           2010-07-01 
>>> 14:02:57.710           318      1846     1012     105
>>> 4109555           296150 2010-07-01 14:59:11.663           2010-07-01 
>>> 15:32:33.810           318      1846     1012     187
>>> 4113305           296194 2010-07-01 15:59:01.797           2010-07-01 
>>> 16:02:27.260           318      1846     1012     108
>>> 4117048           296238 2010-07-01 16:20:47.997           2010-07-01 
>>> 17:32:49.367           318      1846     1012     179
>>> 4120791           296282 2010-07-01 17:58:27.657           2010-07-01 
>>> 18:29:01.733           318      1846     1012     256
>>> 4128291           296370 2010-07-01 19:54:17.687           2010-07-01 
>>> 20:32:53.850           318      1846     1012     239
>>> 4132044           296413 2010-07-01 20:31:37.653           2010-07-01 
>>> 21:29:13.497           318      1846     1012     39
>>> 4135797           296458 2010-07-01 21:59:13.983           2010-07-01 
>>> 22:32:46.503           318      1846     1012     157
>>> 4139572           296506 2010-07-01 22:58:49.530           2010-07-01 
>>> 23:32:22.543           318      1846     1012     218
>>> 4142941           296554 2010-07-01 23:59:13.857           2010-07-02 
>>> 00:32:30.390           318      1846     1012     248
>>> 4146289           296598 2010-07-02 00:58:55.763           2010-07-02 
>>> 01:32:41.983           318      1846     1012     204
>>> 4149616           296642 2010-07-02 01:46:57.357           2010-07-02 
>>> 02:32:56.983           318      1846     1012     42
>>> 4152952           296686 2010-07-02 02:55:19.653           2010-07-02 
>>> 03:32:28.013           318      1846     1012     135
>>> 4156289           296730 2010-07-02 03:43:52.777           2010-07-02 
>>> 04:32:55.250           318      1846     1012     743
>>> 4159624           296774 2010-07-02 04:43:15.310           2010-07-02 
>>> 05:32:44.547           318      1846     1012     277
>>> 4162961           296817 2010-07-02 05:58:59.483           2010-07-02 
>>> 06:32:37.340           318      1846     1012     121
>>> 4166303           296862 2010-07-02 06:58:50.733           2010-07-02 
>>> 07:32:39.113           318      1846     1012     239
>>> 4172981           296950 2010-07-02 07:28:55.293           2010-07-02 
>>> 09:33:01.200           318      1846     1012     512
>>> 4176322           296993 2010-07-02 09:59:04.607           2010-07-02 
>>> 10:33:01.903           318      1846     1012     139
>>> 4179667           297038 2010-07-02 10:55:27.760           2010-07-02 
>>> 11:32:56.560           318      1846     1012     722
>>> 4183012           297082 2010-07-02 11:59:33.650           2010-07-02 
>>> 12:32:14.700            318      1846     1012     163
>>> 4186351           297126 2010-07-02 12:23:45.997           2010-07-02 
>>> 13:32:59.500            318      1846     1012     284
>>> 4189689           297169 2010-07-02 13:44:21.253           2010-07-02 
>>> 14:18:05.080            318      1846     1012     254
>>> 4196371           297258 2010-07-02 16:16:19.123           2010-07-02 
>>> 16:32:53.437           1706     3541     1511     161
>>> 4199720           297301 2010-07-02 16:59:35.127           2010-07-02 
>>> 17:32:57.950           1706     3541     1511     250
>>> 4203068           297346 2010-07-02 17:59:34.027           2010-07-02 
>>> 18:32:54.337           1706     3541     1511     302
>>> 4206413           297389 2010-07-02 18:59:28.730           2010-07-02 
>>> 19:32:37.950           1706     3541     1511     276
>>> 4209758           297434 2010-07-02 19:54:00.243           2010-07-02 
>>> 20:32:57.433           1706     3541     1511     209
>>> 4213102           297473 2010-07-02 20:49:10.963           2010-07-02 
>>> 21:30:44.540           1706     3541     1511     76
>>> 4216447           297511 2010-07-02 21:59:34.810           2010-07-02 
>>> 22:33:00.603           1706     3541     1511     287
>>> 4219818           297569 2010-07-02 22:56:52.750           2010-07-02 
>>> 23:59:31.607           1706     3541     1511     1877
>>> 4219819           297570 2010-07-02 23:59:21.577           2010-07-03 
>>> 00:54:40.153           1706     3541     1511     1798
>>> 4219821           297572 2010-07-03 00:48:03.310           2010-07-03 
>>> 01:59:37.920           1706     3541     1511     1125
>>> 4219823           297574 2010-07-03 01:51:01.057           2010-07-03 
>>> 02:59:45.433           1706     3541     1511     1629
>>> 4219820           297571 2010-07-03 02:59:29.393           2010-07-03 
>>> 03:59:54.920           1706     3541     1511     2462
>>> 4219822           297573 2010-07-03 03:59:18.663           2010-07-03 
>>> 04:01:48.810           1706     3541     1511     70
>>> 4225738           297656 2010-07-03 06:13:34.980           2010-07-03 
>>> 06:28:09.697           1726     3212     1428     46
>>> 4228694           297695 2010-07-03 06:59:15.560           2010-07-03 
>>> 07:32:45.653           1726     3212     1428     251
>>> 4231649           297733 2010-07-03 07:59:11.937           2010-07-03 
>>> 08:32:57.217           1726     3212     1428     284
>>> 4234604           297771 2010-07-03 08:57:00.357           2010-07-03 
>>> 09:32:47.903           1726     3212     1428     227
>>> 4237559           297809 2010-07-03 09:59:19.813           2010-07-03 
>>> 10:33:02.063           1726     3212     1428     285
>>> 4261156           298596 2010-07-04 22:59:09.863           2010-07-04 
>>> 23:33:45.530           1726     3212     1428     1286
>>> 4264114           298646 2010-07-04 23:59:16.967           2010-07-05 
>>> 00:33:08.107           1726     3212     1428     297
>>> 4267067           298690 2010-07-05 00:59:15.187           2010-07-05 
>>> 01:32:48.300           1726     3212     1428     333
>>> 4270023           298734 2010-07-05 01:59:02.497           2010-07-05 
>>> 02:32:48.780           1726     3212     1428     270
>>> 4272977           298778 2010-07-05 02:41:43.737           2010-07-05 
>>> 03:32:56.043           1726     3212     1428     317
>>> 4275927           298822 2010-07-05 03:59:17.027           2010-07-05 
>>> 04:33:14.947           1726     3212     1428     1623
>>> ================================================================================
>>>
>>> Description:
>>> 1. Column: some ID
>>> 2. Column: reference to another table
>>> 3. and 4. column: timestamp from/to of the item
>>> 5. Column: ID R
>>> 6. Column: ID L
>>> 7. Column: ID B
>>> 8. Column: Sum of components
>>>
>>> Requirement:
>>> Sum over all components (from column 8) for each combination of ID R, ID 
>>> L, ID B, but (!)
>>> rows with same keys (R,L,B) should be summed up only until the keys 
>>> change.
>>> Do not sum up the components for identical keys, if there are other keys 
>>> between them.
>>>
>>> Example result:
>>>
>>> idR       idL      idB                 SUM
>>> 1726     3212     1428                 462
>>> 318     1846     1012                 ...
>>> 1706     3541     1511                 ...
>>> 1726     3212     1428                 ...
>>>
>>>
>>> Note that the first and last entry here has the same keys
>>>
>>> Maybe you find a similar monster SQL solving such a requirement.
>>> Thanks for considering!
>>>
>>> Rainer
>>>
>>>
>>>
>>> Am 27.07.2010 12:37, schrieb Oliveiros d'Azevedo Cristina:
>>>> Howdy, Rainer.
>>>>
>>>> It's been a while, so I don't know if you are still interested in this 
>>>> problem or if you, in the meantime, found yourself a solution,
>>>> but I've tried this on a local copy of the example you provided   and 
>>>> it seems to work.
>>>>
>>>> The problem is that I suspect that if you have several thousands of 
>>>> records on your table it will become slow...
>>>>
>>>> Best,
>>>> Oliveiros
>>>>
>>>> SELECT SUM(tudo.parcela),tudo.a
>>>> FROM
>>>> (
>>>> SELECT fo.parcela,fo.a,fo.b,fo.c,MIN(th.c) as d
>>>> FROM
>>>> (
>>>> SELECT se.a as parcela,se.b as a,se.c as b, MAX(pr.c) as c
>>>> FROM
>>>> yourTable se
>>>> LEFT JOIN
>>>> (
>>>> SELECT a.*
>>>> FROM yourTable a
>>>> JOIN yourTable b
>>>> ON (b.b <> a.b)
>>>> AND ((age(a.c,b.c) = '1 day'::interval)
>>>>
>>>> )
>>>> ) pr
>>>> ON pr.b = se.b
>>>> AND    se.c >= pr.c
>>>> GROUP BY se.a,se.b,se.c
>>>> ) fo
>>>> LEFT JOIN
>>>> (
>>>> SELECT a.*
>>>> FROM yourTable a
>>>> JOIN yourTable b
>>>> ON (b.b <> a.b)
>>>> AND ((age(a.c,b.c) = '-1 day'::interval)
>>>> )
>>>> ) th
>>>> ON fo.a = th.b
>>>> AND fo.b <= th.c
>>>> GROUP BY fo.parcela,fo.a,fo.b,fo.c
>>>> ) tudo
>>>> GROUP BY tudo.a,tudo.c,tudo.d
>>>>
>>>>
>>>>
>>>>
>>>> To: <pgsql-sql@postgresql.org>
>>>> Sent: Thursday, July 22, 2010 9:09 AM
>>>> Subject: [SQL] grouping subsets
>>>>
>>>>
>>>>> Hi,
>>>>>
>>>>> having a table similar to
>>>>>
>>>>> | 1 | B | [2010-07-15 Do] |
>>>>> | 1 | B | [2010-07-16 Fr] |
>>>>> |---+---+-----------------|
>>>>> | 2 | C | [2010-07-17 Sa] |
>>>>> | 2 | C | [2010-07-18 So] |
>>>>> |---+---+-----------------|
>>>>> | 1 | B | [2010-07-19 Mo] |
>>>>> | 1 | B | [2010-07-20 Di] |
>>>>> | 1 | B | [2010-07-21 Mi] |
>>>>> | 1 | B | [2010-07-22 Do] |
>>>>> |---+---+-----------------|
>>>>> | 3 | D | [2010-07-23 Fr] |
>>>>>
>>>>> a simple group by gives me:
>>>>>
>>>>> | 6 | B |
>>>>> | 4 | C |
>>>>> | 3 | D |
>>>>>
>>>>>
>>>>> What I want to get is the values grouped by "subset", where a subset 
>>>>> is a set of rows with identical column until the colum changes.
>>>>> Is there a way to get
>>>>>
>>>>> | 2 | B |
>>>>> | 4 | C |
>>>>> | 4 | B |
>>>>> | 3 | D |
>>>>>
>>>>> by SQL only?
>>>>>
>>>>> - Rainer
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> -- 
>>>>> Sent via pgsql-sql mailing list (pgsql-sql@postgresql.org)
>>>>> To make changes to your subscription:
>>>>> http://www.postgresql.org/mailpref/pgsql-sql
>>>>
>>>>
>> 




^ permalink  raw  reply  [nested|flat] 16+ messages in thread

* Re: grouping subsets
  2010-07-22 08:09 grouping subsets Rainer Stengele <rainer.stengele@diplan.de>
  2010-07-27 10:37 ` Re: grouping subsets Oliveiros d'Azevedo Cristina <oliveiros.cristina@marktest.pt>
  2010-07-29 09:41   ` Re: grouping subsets Rainer Stengele <rainer.stengele@diplan.de>
  2010-07-29 11:47     ` Re: grouping subsets Oliveiros d'Azevedo Cristina <oliveiros.cristina@marktest.pt>
  2010-07-29 12:10       ` Re: grouping subsets Rainer Stengele <rainer.stengele@diplan.de>
  2010-07-29 13:31         ` Re: grouping subsets Oliveiros d'Azevedo Cristina <oliveiros.cristina@marktest.pt>
@ 2010-07-30 09:35           ` Rainer Stengele <rainer.stengele@diplan.de>
  2010-07-30 15:07             ` Re: grouping subsets Oliveiros d'Azevedo Cristina <oliveiros.cristina@marktest.pt>
  0 siblings, 1 reply; 16+ messages in thread

From: Rainer Stengele @ 2010-07-30 09:35 UTC (permalink / raw)
  To: Oliveiros d'Azevedo Cristina <oliveiros.cristina@marktest.pt>; +Cc: pgsql-sql

the table may include up to maybe 30 entries per day, average maybe 10-15
After a year this makes about 10.000 entries - maximum, average about 5000 entries.

For the problem described I have to use a Microsoft SQL database and would like to use pure SQL.
As I use postgres on my Linux servers I found this newsgroup and thought I ask here.

Thanks!
Rainer

Am 29.07.2010 15:31, schrieb Oliveiros d'Azevedo Cristina:
> Fine.
> 
> Please advice me,
> 
> How long can
> your table be? Thousands? Millions of records?
> 
> Do you really need it in pure SQL
> ?
> 
> It seems to me that it might be possible, I'm just affraid that the query would become too complex and thus slow...
> 
> Best,
> Oliveiros
> 
> ----- Original Message ----- From: "Rainer Stengele" <rainer.stengele@diplan.de>
> To: "Oliveiros d'Azevedo Cristina" <oliveiros.cristina@marktest.pt>
> Cc: <pgsql-sql@postgresql.org>
> Sent: Thursday, July 29, 2010 1:10 PM
> Subject: Re: grouping subsets
> 
> 
>> No. This is by accident.
>> We have to assume that the combinations do change anytime, and many times per day.
>>
>> So
>>
>> "Or is it possible to have the same combination on one day with several sets?"
>>
>> YES!
>>
>> Rainer
>>
>>
>>
>> Am 29.07.2010 13:47, schrieb Oliveiros d'Azevedo Cristina:
>>> Yes. This is somewhat more complicated because it has more constraints.
>>> I've noticed that a given combination doesn't appear with holes on a certain day.
>>>
>>> For ex, on a daily basis, we have every three key combinations together.
>>>
>>> We dont have things like
>>> 2010-7-01  1726 3212 1428
>>> 2010-7-01  1726 3212 1428
>>> ...                318   1846 1012
>>> 2010-7-01  1726 3212 1428
>>>
>>> Can I assume that, for a certain day , the records for the same three combination are all together? There is just one set per day for a given combination?
>>>
>>> Or is it possible to have the same combination on one day with several sets?
>>>
>>> Best,
>>> Oliveiros
>>>
>>>
>>> ----- Original Message ----- From: "Rainer Stengele" <rainer.stengele@diplan.de>
>>> Newsgroups: gmane.comp.db.postgresql.sql
>>> To: "Oliveiros d'Azevedo Cristina" <oliveiros.cristina@marktest.pt>
>>> Cc: <>
>>> Sent: Thursday, July 29, 2010 10:41 AM
>>> Subject: Re: grouping subsets
>>>
>>>
>>>> Howdy Cristina,
>>>>
>>>> unfortunately things are more complicated. I have inserted an excerpt of the real data here:
>>>>
>>>> ================================================================================
>>>> TableID         MasterID dtBegin                           dtEnd idR idL      idB     consumption
>>>> 4057312           295530 2010-07-01 00:59:21.077           2010-07-01 01:32:59.670           1726     3212     1428     279
>>>> 4061043           295574 2010-07-01 01:59:31.137           2010-07-01 02:32:09.373           1726     3212     1428     183
>>>> 4083397           295838 2010-07-01 07:57:51.327           2010-07-01 08:28:28.117           318      1846     1012     30
>>>> 4090858           295920 2010-07-01 09:52:33.777           2010-07-01 10:31:34.393           318      1846     1012     487
>>>> 4094589           295961 2010-07-01 10:47:59.370           2010-07-01 11:32:20.903           318      1846     1012     472
>>>> 4098330           296013 2010-07-01 11:58:53.890           2010-07-01 12:31:35.730           318      1846     1012     195
>>>> 4102069           296058 2010-07-01 12:36:19.170           2010-07-01 13:32:13.950           318      1846     1012     338
>>>> 4105809           296102 2010-07-01 13:58:53.170           2010-07-01 14:02:57.710           318      1846     1012     105
>>>> 4109555           296150 2010-07-01 14:59:11.663           2010-07-01 15:32:33.810           318      1846     1012     187
>>>> 4113305           296194 2010-07-01 15:59:01.797           2010-07-01 16:02:27.260           318      1846     1012     108
>>>> 4117048           296238 2010-07-01 16:20:47.997           2010-07-01 17:32:49.367           318      1846     1012     179
>>>> 4120791           296282 2010-07-01 17:58:27.657           2010-07-01 18:29:01.733           318      1846     1012     256
>>>> 4128291           296370 2010-07-01 19:54:17.687           2010-07-01 20:32:53.850           318      1846     1012     239
>>>> 4132044           296413 2010-07-01 20:31:37.653           2010-07-01 21:29:13.497           318      1846     1012     39
>>>> 4135797           296458 2010-07-01 21:59:13.983           2010-07-01 22:32:46.503           318      1846     1012     157
>>>> 4139572           296506 2010-07-01 22:58:49.530           2010-07-01 23:32:22.543           318      1846     1012     218
>>>> 4142941           296554 2010-07-01 23:59:13.857           2010-07-02 00:32:30.390           318      1846     1012     248
>>>> 4146289           296598 2010-07-02 00:58:55.763           2010-07-02 01:32:41.983           318      1846     1012     204
>>>> 4149616           296642 2010-07-02 01:46:57.357           2010-07-02 02:32:56.983           318      1846     1012     42
>>>> 4152952           296686 2010-07-02 02:55:19.653           2010-07-02 03:32:28.013           318      1846     1012     135
>>>> 4156289           296730 2010-07-02 03:43:52.777           2010-07-02 04:32:55.250           318      1846     1012     743
>>>> 4159624           296774 2010-07-02 04:43:15.310           2010-07-02 05:32:44.547           318      1846     1012     277
>>>> 4162961           296817 2010-07-02 05:58:59.483           2010-07-02 06:32:37.340           318      1846     1012     121
>>>> 4166303           296862 2010-07-02 06:58:50.733           2010-07-02 07:32:39.113           318      1846     1012     239
>>>> 4172981           296950 2010-07-02 07:28:55.293           2010-07-02 09:33:01.200           318      1846     1012     512
>>>> 4176322           296993 2010-07-02 09:59:04.607           2010-07-02 10:33:01.903           318      1846     1012     139
>>>> 4179667           297038 2010-07-02 10:55:27.760           2010-07-02 11:32:56.560           318      1846     1012     722
>>>> 4183012           297082 2010-07-02 11:59:33.650           2010-07-02 12:32:14.700            318      1846     1012     163
>>>> 4186351           297126 2010-07-02 12:23:45.997           2010-07-02 13:32:59.500            318      1846     1012     284
>>>> 4189689           297169 2010-07-02 13:44:21.253           2010-07-02 14:18:05.080            318      1846     1012     254
>>>> 4196371           297258 2010-07-02 16:16:19.123           2010-07-02 16:32:53.437           1706     3541     1511     161
>>>> 4199720           297301 2010-07-02 16:59:35.127           2010-07-02 17:32:57.950           1706     3541     1511     250
>>>> 4203068           297346 2010-07-02 17:59:34.027           2010-07-02 18:32:54.337           1706     3541     1511     302
>>>> 4206413           297389 2010-07-02 18:59:28.730           2010-07-02 19:32:37.950           1706     3541     1511     276
>>>> 4209758           297434 2010-07-02 19:54:00.243           2010-07-02 20:32:57.433           1706     3541     1511     209
>>>> 4213102           297473 2010-07-02 20:49:10.963           2010-07-02 21:30:44.540           1706     3541     1511     76
>>>> 4216447           297511 2010-07-02 21:59:34.810           2010-07-02 22:33:00.603           1706     3541     1511     287
>>>> 4219818           297569 2010-07-02 22:56:52.750           2010-07-02 23:59:31.607           1706     3541     1511     1877
>>>> 4219819           297570 2010-07-02 23:59:21.577           2010-07-03 00:54:40.153           1706     3541     1511     1798
>>>> 4219821           297572 2010-07-03 00:48:03.310           2010-07-03 01:59:37.920           1706     3541     1511     1125
>>>> 4219823           297574 2010-07-03 01:51:01.057           2010-07-03 02:59:45.433           1706     3541     1511     1629
>>>> 4219820           297571 2010-07-03 02:59:29.393           2010-07-03 03:59:54.920           1706     3541     1511     2462
>>>> 4219822           297573 2010-07-03 03:59:18.663           2010-07-03 04:01:48.810           1706     3541     1511     70
>>>> 4225738           297656 2010-07-03 06:13:34.980           2010-07-03 06:28:09.697           1726     3212     1428     46
>>>> 4228694           297695 2010-07-03 06:59:15.560           2010-07-03 07:32:45.653           1726     3212     1428     251
>>>> 4231649           297733 2010-07-03 07:59:11.937           2010-07-03 08:32:57.217           1726     3212     1428     284
>>>> 4234604           297771 2010-07-03 08:57:00.357           2010-07-03 09:32:47.903           1726     3212     1428     227
>>>> 4237559           297809 2010-07-03 09:59:19.813           2010-07-03 10:33:02.063           1726     3212     1428     285
>>>> 4261156           298596 2010-07-04 22:59:09.863           2010-07-04 23:33:45.530           1726     3212     1428     1286
>>>> 4264114           298646 2010-07-04 23:59:16.967           2010-07-05 00:33:08.107           1726     3212     1428     297
>>>> 4267067           298690 2010-07-05 00:59:15.187           2010-07-05 01:32:48.300           1726     3212     1428     333
>>>> 4270023           298734 2010-07-05 01:59:02.497           2010-07-05 02:32:48.780           1726     3212     1428     270
>>>> 4272977           298778 2010-07-05 02:41:43.737           2010-07-05 03:32:56.043           1726     3212     1428     317
>>>> 4275927           298822 2010-07-05 03:59:17.027           2010-07-05 04:33:14.947           1726     3212     1428     1623
>>>> ================================================================================
>>>>
>>>> Description:
>>>> 1. Column: some ID
>>>> 2. Column: reference to another table
>>>> 3. and 4. column: timestamp from/to of the item
>>>> 5. Column: ID R
>>>> 6. Column: ID L
>>>> 7. Column: ID B
>>>> 8. Column: Sum of components
>>>>
>>>> Requirement:
>>>> Sum over all components (from column 8) for each combination of ID R, ID L, ID B, but (!)
>>>> rows with same keys (R,L,B) should be summed up only until the keys change.
>>>> Do not sum up the components for identical keys, if there are other keys between them.
>>>>
>>>> Example result:
>>>>
>>>> idR       idL      idB                 SUM
>>>> 1726     3212     1428                 462
>>>> 318     1846     1012                 ...
>>>> 1706     3541     1511                 ...
>>>> 1726     3212     1428                 ...
>>>>
>>>>
>>>> Note that the first and last entry here has the same keys
>>>>
>>>> Maybe you find a similar monster SQL solving such a requirement.
>>>> Thanks for considering!
>>>>
>>>> Rainer
>>>>
>>>>
>>>>
>>>> Am 27.07.2010 12:37, schrieb Oliveiros d'Azevedo Cristina:
>>>>> Howdy, Rainer.
>>>>>
>>>>> It's been a while, so I don't know if you are still interested in this problem or if you, in the meantime, found yourself a solution,
>>>>> but I've tried this on a local copy of the example you provided   and it seems to work.
>>>>>
>>>>> The problem is that I suspect that if you have several thousands of records on your table it will become slow...
>>>>>
>>>>> Best,
>>>>> Oliveiros
>>>>>
>>>>> SELECT SUM(tudo.parcela),tudo.a
>>>>> FROM
>>>>> (
>>>>> SELECT fo.parcela,fo.a,fo.b,fo.c,MIN(th.c) as d
>>>>> FROM
>>>>> (
>>>>> SELECT se.a as parcela,se.b as a,se.c as b, MAX(pr.c) as c
>>>>> FROM
>>>>> yourTable se
>>>>> LEFT JOIN
>>>>> (
>>>>> SELECT a.*
>>>>> FROM yourTable a
>>>>> JOIN yourTable b
>>>>> ON (b.b <> a.b)
>>>>> AND ((age(a.c,b.c) = '1 day'::interval)
>>>>>
>>>>> )
>>>>> ) pr
>>>>> ON pr.b = se.b
>>>>> AND    se.c >= pr.c
>>>>> GROUP BY se.a,se.b,se.c
>>>>> ) fo
>>>>> LEFT JOIN
>>>>> (
>>>>> SELECT a.*
>>>>> FROM yourTable a
>>>>> JOIN yourTable b
>>>>> ON (b.b <> a.b)
>>>>> AND ((age(a.c,b.c) = '-1 day'::interval)
>>>>> )
>>>>> ) th
>>>>> ON fo.a = th.b
>>>>> AND fo.b <= th.c
>>>>> GROUP BY fo.parcela,fo.a,fo.b,fo.c
>>>>> ) tudo
>>>>> GROUP BY tudo.a,tudo.c,tudo.d
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> To: <pgsql-sql@postgresql.org>
>>>>> Sent: Thursday, July 22, 2010 9:09 AM
>>>>> Subject: [SQL] grouping subsets
>>>>>
>>>>>
>>>>>> Hi,
>>>>>>
>>>>>> having a table similar to
>>>>>>
>>>>>> | 1 | B | [2010-07-15 Do] |
>>>>>> | 1 | B | [2010-07-16 Fr] |
>>>>>> |---+---+-----------------|
>>>>>> | 2 | C | [2010-07-17 Sa] |
>>>>>> | 2 | C | [2010-07-18 So] |
>>>>>> |---+---+-----------------|
>>>>>> | 1 | B | [2010-07-19 Mo] |
>>>>>> | 1 | B | [2010-07-20 Di] |
>>>>>> | 1 | B | [2010-07-21 Mi] |
>>>>>> | 1 | B | [2010-07-22 Do] |
>>>>>> |---+---+-----------------|
>>>>>> | 3 | D | [2010-07-23 Fr] |
>>>>>>
>>>>>> a simple group by gives me:
>>>>>>
>>>>>> | 6 | B |
>>>>>> | 4 | C |
>>>>>> | 3 | D |
>>>>>>
>>>>>>
>>>>>> What I want to get is the values grouped by "subset", where a subset is a set of rows with identical column until the colum changes.
>>>>>> Is there a way to get
>>>>>>
>>>>>> | 2 | B |
>>>>>> | 4 | C |
>>>>>> | 4 | B |
>>>>>> | 3 | D |
>>>>>>
>>>>>> by SQL only?
>>>>>>
>>>>>> - Rainer
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> -- 
>>>>>> Sent via pgsql-sql mailing list (pgsql-sql@postgresql.org)
>>>>>> To make changes to your subscription:
>>>>>> http://www.postgresql.org/mailpref/pgsql-sql
>>>>>
>>>>>
>>>
> 
> 




^ permalink  raw  reply  [nested|flat] 16+ messages in thread

* Re: grouping subsets
  2010-07-22 08:09 grouping subsets Rainer Stengele <rainer.stengele@diplan.de>
  2010-07-27 10:37 ` Re: grouping subsets Oliveiros d'Azevedo Cristina <oliveiros.cristina@marktest.pt>
  2010-07-29 09:41   ` Re: grouping subsets Rainer Stengele <rainer.stengele@diplan.de>
  2010-07-29 11:47     ` Re: grouping subsets Oliveiros d'Azevedo Cristina <oliveiros.cristina@marktest.pt>
  2010-07-29 12:10       ` Re: grouping subsets Rainer Stengele <rainer.stengele@diplan.de>
  2010-07-29 13:31         ` Re: grouping subsets Oliveiros d'Azevedo Cristina <oliveiros.cristina@marktest.pt>
  2010-07-30 09:35           ` Re: grouping subsets Rainer Stengele <rainer.stengele@diplan.de>
@ 2010-07-30 15:07             ` Oliveiros d'Azevedo Cristina <oliveiros.cristina@marktest.pt>
  2010-07-31 19:48               ` Re: grouping subsets Rainer Stengele <rainer.stengele@diplan.de>
  0 siblings, 1 reply; 16+ messages in thread

From: Oliveiros d'Azevedo Cristina @ 2010-07-30 15:07 UTC (permalink / raw)
  To: Rainer Stengele <rainer.stengele@diplan.de>; +Cc: pgsql-sql

I See.

And the analysis you need to do, the sum of the rows with the same keys 
(until they change) will have to be done over all
table?
Or just over some predefined interval ?

Best,
Oliveiros
----- Original Message ----- 
From: "Rainer Stengele" <rainer.stengele@diplan.de>
Newsgroups: gmane.comp.db.postgresql.sql
To: "Oliveiros d'Azevedo Cristina" <oliveiros.cristina@marktest.pt>
Cc: <pgsql-sql@postgresql.org>
Sent: Friday, July 30, 2010 10:35 AM
Subject: Re: grouping subsets


> the table may include up to maybe 30 entries per day, average maybe 10-15
> After a year this makes about 10.000 entries - maximum, average about 5000 
> entries.
>
> For the problem described I have to use a Microsoft SQL database and would 
> like to use pure SQL.
> As I use postgres on my Linux servers I found this newsgroup and thought I 
> ask here.
>
> Thanks!
> Rainer
>
> Am 29.07.2010 15:31, schrieb Oliveiros d'Azevedo Cristina:
>> Fine.
>>
>> Please advice me,
>>
>> How long can
>> your table be? Thousands? Millions of records?
>>
>> Do you really need it in pure SQL
>> ?
>>
>> It seems to me that it might be possible, I'm just affraid that the query 
>> would become too complex and thus slow...
>>
>> Best,
>> Oliveiros
>>
>> ----- Original Message ----- From: "Rainer Stengele" 
>> <rainer.stengele@diplan.de>
>> To: "Oliveiros d'Azevedo Cristina" <oliveiros.cristina@marktest.pt>
>> Cc: <pgsql-sql@postgresql.org>
>> Sent: Thursday, July 29, 2010 1:10 PM
>> Subject: Re: grouping subsets
>>
>>
>>> No. This is by accident.
>>> We have to assume that the combinations do change anytime, and many 
>>> times per day.
>>>
>>> So
>>>
>>> "Or is it possible to have the same combination on one day with several 
>>> sets?"
>>>
>>> YES!
>>>
>>> Rainer
>>>
>>>
>>>
>>> Am 29.07.2010 13:47, schrieb Oliveiros d'Azevedo Cristina:
>>>> Yes. This is somewhat more complicated because it has more constraints.
>>>> I've noticed that a given combination doesn't appear with holes on a 
>>>> certain day.
>>>>
>>>> For ex, on a daily basis, we have every three key combinations 
>>>> together.
>>>>
>>>> We dont have things like
>>>> 2010-7-01  1726 3212 1428
>>>> 2010-7-01  1726 3212 1428
>>>> ...                318   1846 1012
>>>> 2010-7-01  1726 3212 1428
>>>>
>>>> Can I assume that, for a certain day , the records for the same three 
>>>> combination are all together? There is just one set per day for a given 
>>>> combination?
>>>>
>>>> Or is it possible to have the same combination on one day with several 
>>>> sets?
>>>>
>>>> Best,
>>>> Oliveiros
>>>>
>>>>
>>>> ----- Original Message ----- From: "Rainer Stengele" 
>>>> <rainer.stengele@diplan.de>
>>>> Newsgroups: gmane.comp.db.postgresql.sql
>>>> To: "Oliveiros d'Azevedo Cristina" <oliveiros.cristina@marktest.pt>
>>>> Cc: <>
>>>> Sent: Thursday, July 29, 2010 10:41 AM
>>>> Subject: Re: grouping subsets
>>>>
>>>>
>>>>> Howdy Cristina,
>>>>>
>>>>> unfortunately things are more complicated. I have inserted an excerpt 
>>>>> of the real data here:
>>>>>
>>>>> ================================================================================
>>>>> TableID         MasterID dtBegin                           dtEnd idR 
>>>>> idL      idB     consumption
>>>>> 4057312           295530 2010-07-01 00:59:21.077           2010-07-01 
>>>>> 01:32:59.670           1726     3212     1428     279
>>>>> 4061043           295574 2010-07-01 01:59:31.137           2010-07-01 
>>>>> 02:32:09.373           1726     3212     1428     183
>>>>> 4083397           295838 2010-07-01 07:57:51.327           2010-07-01 
>>>>> 08:28:28.117           318      1846     1012     30
>>>>> 4090858           295920 2010-07-01 09:52:33.777           2010-07-01 
>>>>> 10:31:34.393           318      1846     1012     487
>>>>> 4094589           295961 2010-07-01 10:47:59.370           2010-07-01 
>>>>> 11:32:20.903           318      1846     1012     472
>>>>> 4098330           296013 2010-07-01 11:58:53.890           2010-07-01 
>>>>> 12:31:35.730           318      1846     1012     195
>>>>> 4102069           296058 2010-07-01 12:36:19.170           2010-07-01 
>>>>> 13:32:13.950           318      1846     1012     338
>>>>> 4105809           296102 2010-07-01 13:58:53.170           2010-07-01 
>>>>> 14:02:57.710           318      1846     1012     105
>>>>> 4109555           296150 2010-07-01 14:59:11.663           2010-07-01 
>>>>> 15:32:33.810           318      1846     1012     187
>>>>> 4113305           296194 2010-07-01 15:59:01.797           2010-07-01 
>>>>> 16:02:27.260           318      1846     1012     108
>>>>> 4117048           296238 2010-07-01 16:20:47.997           2010-07-01 
>>>>> 17:32:49.367           318      1846     1012     179
>>>>> 4120791           296282 2010-07-01 17:58:27.657           2010-07-01 
>>>>> 18:29:01.733           318      1846     1012     256
>>>>> 4128291           296370 2010-07-01 19:54:17.687           2010-07-01 
>>>>> 20:32:53.850           318      1846     1012     239
>>>>> 4132044           296413 2010-07-01 20:31:37.653           2010-07-01 
>>>>> 21:29:13.497           318      1846     1012     39
>>>>> 4135797           296458 2010-07-01 21:59:13.983           2010-07-01 
>>>>> 22:32:46.503           318      1846     1012     157
>>>>> 4139572           296506 2010-07-01 22:58:49.530           2010-07-01 
>>>>> 23:32:22.543           318      1846     1012     218
>>>>> 4142941           296554 2010-07-01 23:59:13.857           2010-07-02 
>>>>> 00:32:30.390           318      1846     1012     248
>>>>> 4146289           296598 2010-07-02 00:58:55.763           2010-07-02 
>>>>> 01:32:41.983           318      1846     1012     204
>>>>> 4149616           296642 2010-07-02 01:46:57.357           2010-07-02 
>>>>> 02:32:56.983           318      1846     1012     42
>>>>> 4152952           296686 2010-07-02 02:55:19.653           2010-07-02 
>>>>> 03:32:28.013           318      1846     1012     135
>>>>> 4156289           296730 2010-07-02 03:43:52.777           2010-07-02 
>>>>> 04:32:55.250           318      1846     1012     743
>>>>> 4159624           296774 2010-07-02 04:43:15.310           2010-07-02 
>>>>> 05:32:44.547           318      1846     1012     277
>>>>> 4162961           296817 2010-07-02 05:58:59.483           2010-07-02 
>>>>> 06:32:37.340           318      1846     1012     121
>>>>> 4166303           296862 2010-07-02 06:58:50.733           2010-07-02 
>>>>> 07:32:39.113           318      1846     1012     239
>>>>> 4172981           296950 2010-07-02 07:28:55.293           2010-07-02 
>>>>> 09:33:01.200           318      1846     1012     512
>>>>> 4176322           296993 2010-07-02 09:59:04.607           2010-07-02 
>>>>> 10:33:01.903           318      1846     1012     139
>>>>> 4179667           297038 2010-07-02 10:55:27.760           2010-07-02 
>>>>> 11:32:56.560           318      1846     1012     722
>>>>> 4183012           297082 2010-07-02 11:59:33.650           2010-07-02 
>>>>> 12:32:14.700            318      1846     1012     163
>>>>> 4186351           297126 2010-07-02 12:23:45.997           2010-07-02 
>>>>> 13:32:59.500            318      1846     1012     284
>>>>> 4189689           297169 2010-07-02 13:44:21.253           2010-07-02 
>>>>> 14:18:05.080            318      1846     1012     254
>>>>> 4196371           297258 2010-07-02 16:16:19.123           2010-07-02 
>>>>> 16:32:53.437           1706     3541     1511     161
>>>>> 4199720           297301 2010-07-02 16:59:35.127           2010-07-02 
>>>>> 17:32:57.950           1706     3541     1511     250
>>>>> 4203068           297346 2010-07-02 17:59:34.027           2010-07-02 
>>>>> 18:32:54.337           1706     3541     1511     302
>>>>> 4206413           297389 2010-07-02 18:59:28.730           2010-07-02 
>>>>> 19:32:37.950           1706     3541     1511     276
>>>>> 4209758           297434 2010-07-02 19:54:00.243           2010-07-02 
>>>>> 20:32:57.433           1706     3541     1511     209
>>>>> 4213102           297473 2010-07-02 20:49:10.963           2010-07-02 
>>>>> 21:30:44.540           1706     3541     1511     76
>>>>> 4216447           297511 2010-07-02 21:59:34.810           2010-07-02 
>>>>> 22:33:00.603           1706     3541     1511     287
>>>>> 4219818           297569 2010-07-02 22:56:52.750           2010-07-02 
>>>>> 23:59:31.607           1706     3541     1511     1877
>>>>> 4219819           297570 2010-07-02 23:59:21.577           2010-07-03 
>>>>> 00:54:40.153           1706     3541     1511     1798
>>>>> 4219821           297572 2010-07-03 00:48:03.310           2010-07-03 
>>>>> 01:59:37.920           1706     3541     1511     1125
>>>>> 4219823           297574 2010-07-03 01:51:01.057           2010-07-03 
>>>>> 02:59:45.433           1706     3541     1511     1629
>>>>> 4219820           297571 2010-07-03 02:59:29.393           2010-07-03 
>>>>> 03:59:54.920           1706     3541     1511     2462
>>>>> 4219822           297573 2010-07-03 03:59:18.663           2010-07-03 
>>>>> 04:01:48.810           1706     3541     1511     70
>>>>> 4225738           297656 2010-07-03 06:13:34.980           2010-07-03 
>>>>> 06:28:09.697           1726     3212     1428     46
>>>>> 4228694           297695 2010-07-03 06:59:15.560           2010-07-03 
>>>>> 07:32:45.653           1726     3212     1428     251
>>>>> 4231649           297733 2010-07-03 07:59:11.937           2010-07-03 
>>>>> 08:32:57.217           1726     3212     1428     284
>>>>> 4234604           297771 2010-07-03 08:57:00.357           2010-07-03 
>>>>> 09:32:47.903           1726     3212     1428     227
>>>>> 4237559           297809 2010-07-03 09:59:19.813           2010-07-03 
>>>>> 10:33:02.063           1726     3212     1428     285
>>>>> 4261156           298596 2010-07-04 22:59:09.863           2010-07-04 
>>>>> 23:33:45.530           1726     3212     1428     1286
>>>>> 4264114           298646 2010-07-04 23:59:16.967           2010-07-05 
>>>>> 00:33:08.107           1726     3212     1428     297
>>>>> 4267067           298690 2010-07-05 00:59:15.187           2010-07-05 
>>>>> 01:32:48.300           1726     3212     1428     333
>>>>> 4270023           298734 2010-07-05 01:59:02.497           2010-07-05 
>>>>> 02:32:48.780           1726     3212     1428     270
>>>>> 4272977           298778 2010-07-05 02:41:43.737           2010-07-05 
>>>>> 03:32:56.043           1726     3212     1428     317
>>>>> 4275927           298822 2010-07-05 03:59:17.027           2010-07-05 
>>>>> 04:33:14.947           1726     3212     1428     1623
>>>>> ================================================================================
>>>>>
>>>>> Description:
>>>>> 1. Column: some ID
>>>>> 2. Column: reference to another table
>>>>> 3. and 4. column: timestamp from/to of the item
>>>>> 5. Column: ID R
>>>>> 6. Column: ID L
>>>>> 7. Column: ID B
>>>>> 8. Column: Sum of components
>>>>>
>>>>> Requirement:
>>>>> Sum over all components (from column 8) for each combination of ID R, 
>>>>> ID L, ID B, but (!)
>>>>> rows with same keys (R,L,B) should be summed up only until the keys 
>>>>> change.
>>>>> Do not sum up the components for identical keys, if there are other 
>>>>> keys between them.
>>>>>
>>>>> Example result:
>>>>>
>>>>> idR       idL      idB                 SUM
>>>>> 1726     3212     1428                 462
>>>>> 318     1846     1012                 ...
>>>>> 1706     3541     1511                 ...
>>>>> 1726     3212     1428                 ...
>>>>>
>>>>>
>>>>> Note that the first and last entry here has the same keys
>>>>>
>>>>> Maybe you find a similar monster SQL solving such a requirement.
>>>>> Thanks for considering!
>>>>>
>>>>> Rainer
>>>>>
>>>>>
>>>>>
>>>>> Am 27.07.2010 12:37, schrieb Oliveiros d'Azevedo Cristina:
>>>>>> Howdy, Rainer.
>>>>>>
>>>>>> It's been a while, so I don't know if you are still interested in 
>>>>>> this problem or if you, in the meantime, found yourself a solution,
>>>>>> but I've tried this on a local copy of the example you provided   and 
>>>>>> it seems to work.
>>>>>>
>>>>>> The problem is that I suspect that if you have several thousands of 
>>>>>> records on your table it will become slow...
>>>>>>
>>>>>> Best,
>>>>>> Oliveiros
>>>>>>
>>>>>> SELECT SUM(tudo.parcela),tudo.a
>>>>>> FROM
>>>>>> (
>>>>>> SELECT fo.parcela,fo.a,fo.b,fo.c,MIN(th.c) as d
>>>>>> FROM
>>>>>> (
>>>>>> SELECT se.a as parcela,se.b as a,se.c as b, MAX(pr.c) as c
>>>>>> FROM
>>>>>> yourTable se
>>>>>> LEFT JOIN
>>>>>> (
>>>>>> SELECT a.*
>>>>>> FROM yourTable a
>>>>>> JOIN yourTable b
>>>>>> ON (b.b <> a.b)
>>>>>> AND ((age(a.c,b.c) = '1 day'::interval)
>>>>>>
>>>>>> )
>>>>>> ) pr
>>>>>> ON pr.b = se.b
>>>>>> AND    se.c >= pr.c
>>>>>> GROUP BY se.a,se.b,se.c
>>>>>> ) fo
>>>>>> LEFT JOIN
>>>>>> (
>>>>>> SELECT a.*
>>>>>> FROM yourTable a
>>>>>> JOIN yourTable b
>>>>>> ON (b.b <> a.b)
>>>>>> AND ((age(a.c,b.c) = '-1 day'::interval)
>>>>>> )
>>>>>> ) th
>>>>>> ON fo.a = th.b
>>>>>> AND fo.b <= th.c
>>>>>> GROUP BY fo.parcela,fo.a,fo.b,fo.c
>>>>>> ) tudo
>>>>>> GROUP BY tudo.a,tudo.c,tudo.d
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> To: <pgsql-sql@postgresql.org>
>>>>>> Sent: Thursday, July 22, 2010 9:09 AM
>>>>>> Subject: [SQL] grouping subsets
>>>>>>
>>>>>>
>>>>>>> Hi,
>>>>>>>
>>>>>>> having a table similar to
>>>>>>>
>>>>>>> | 1 | B | [2010-07-15 Do] |
>>>>>>> | 1 | B | [2010-07-16 Fr] |
>>>>>>> |---+---+-----------------|
>>>>>>> | 2 | C | [2010-07-17 Sa] |
>>>>>>> | 2 | C | [2010-07-18 So] |
>>>>>>> |---+---+-----------------|
>>>>>>> | 1 | B | [2010-07-19 Mo] |
>>>>>>> | 1 | B | [2010-07-20 Di] |
>>>>>>> | 1 | B | [2010-07-21 Mi] |
>>>>>>> | 1 | B | [2010-07-22 Do] |
>>>>>>> |---+---+-----------------|
>>>>>>> | 3 | D | [2010-07-23 Fr] |
>>>>>>>
>>>>>>> a simple group by gives me:
>>>>>>>
>>>>>>> | 6 | B |
>>>>>>> | 4 | C |
>>>>>>> | 3 | D |
>>>>>>>
>>>>>>>
>>>>>>> What I want to get is the values grouped by "subset", where a subset 
>>>>>>> is a set of rows with identical column until the colum changes.
>>>>>>> Is there a way to get
>>>>>>>
>>>>>>> | 2 | B |
>>>>>>> | 4 | C |
>>>>>>> | 4 | B |
>>>>>>> | 3 | D |
>>>>>>>
>>>>>>> by SQL only?
>>>>>>>
>>>>>>> - Rainer
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> -- 
>>>>>>> Sent via pgsql-sql mailing list (pgsql-sql@postgresql.org)
>>>>>>> To make changes to your subscription:
>>>>>>> http://www.postgresql.org/mailpref/pgsql-sql
>>>>>>
>>>>>>
>>>>
>>
>> 




^ permalink  raw  reply  [nested|flat] 16+ messages in thread

* Re: grouping subsets
  2010-07-22 08:09 grouping subsets Rainer Stengele <rainer.stengele@diplan.de>
  2010-07-27 10:37 ` Re: grouping subsets Oliveiros d'Azevedo Cristina <oliveiros.cristina@marktest.pt>
  2010-07-29 09:41   ` Re: grouping subsets Rainer Stengele <rainer.stengele@diplan.de>
  2010-07-29 11:47     ` Re: grouping subsets Oliveiros d'Azevedo Cristina <oliveiros.cristina@marktest.pt>
  2010-07-29 12:10       ` Re: grouping subsets Rainer Stengele <rainer.stengele@diplan.de>
  2010-07-29 13:31         ` Re: grouping subsets Oliveiros d'Azevedo Cristina <oliveiros.cristina@marktest.pt>
  2010-07-30 09:35           ` Re: grouping subsets Rainer Stengele <rainer.stengele@diplan.de>
  2010-07-30 15:07             ` Re: grouping subsets Oliveiros d'Azevedo Cristina <oliveiros.cristina@marktest.pt>
@ 2010-07-31 19:48               ` Rainer Stengele <rainer.stengele@diplan.de>
  0 siblings, 0 replies; 16+ messages in thread

From: Rainer Stengele @ 2010-07-31 19:48 UTC (permalink / raw)
  To: Oliveiros d'Azevedo Cristina <oliveiros.cristina@marktest.pt>; +Cc: pgsql-sql

 The analysis will have to be done over a calendar range which the user 
selects via web interface. So - yes - normally not the whole table, but
maybe he chooses one month and thats already a lot of rows in the table ...

Best, too,
Rainer

Am 30.07.2010 17:07, schrieb Oliveiros d'Azevedo Cristina:
> I See.
>
> And the analysis you need to do, the sum of the rows with the same
> keys (until they change) will have to be done over all
> table?
> Or just over some predefined interval ?
>
> Best,
> Oliveiros
> ----- Original Message ----- From: "Rainer Stengele"
> <rainer.stengele@diplan.de>
> Newsgroups: gmane.comp.db.postgresql.sql
> To: "Oliveiros d'Azevedo Cristina" <oliveiros.cristina@marktest.pt>
> Cc: <pgsql-sql@postgresql.org>
> Sent: Friday, July 30, 2010 10:35 AM
> Subject: Re: grouping subsets
>
>
>> the table may include up to maybe 30 entries per day, average maybe
>> 10-15
>> After a year this makes about 10.000 entries - maximum, average about
>> 5000 entries.
>>
>> For the problem described I have to use a Microsoft SQL database and
>> would like to use pure SQL.
>> As I use postgres on my Linux servers I found this newsgroup and
>> thought I ask here.
>>
>> Thanks!
>> Rainer
>>
>> Am 29.07.2010 15:31, schrieb Oliveiros d'Azevedo Cristina:
>>> Fine.
>>>
>>> Please advice me,
>>>
>>> How long can
>>> your table be? Thousands? Millions of records?
>>>
>>> Do you really need it in pure SQL
>>> ?
>>>
>>> It seems to me that it might be possible, I'm just affraid that the
>>> query would become too complex and thus slow...
>>>
>>> Best,
>>> Oliveiros
>>>
>>> ----- Original Message ----- From: "Rainer Stengele"
>>> <rainer.stengele@diplan.de>
>>> To: "Oliveiros d'Azevedo Cristina" <oliveiros.cristina@marktest.pt>
>>> Cc: <pgsql-sql@postgresql.org>
>>> Sent: Thursday, July 29, 2010 1:10 PM
>>> Subject: Re: grouping subsets
>>>
>>>
>>>> No. This is by accident.
>>>> We have to assume that the combinations do change anytime, and many
>>>> times per day.
>>>>
>>>> So
>>>>
>>>> "Or is it possible to have the same combination on one day with
>>>> several sets?"
>>>>
>>>> YES!
>>>>
>>>> Rainer
>>>>
>>>>
>>>>
>>>> Am 29.07.2010 13:47, schrieb Oliveiros d'Azevedo Cristina:
>>>>> Yes. This is somewhat more complicated because it has more
>>>>> constraints.
>>>>> I've noticed that a given combination doesn't appear with holes on
>>>>> a certain day.
>>>>>
>>>>> For ex, on a daily basis, we have every three key combinations
>>>>> together.
>>>>>
>>>>> We dont have things like
>>>>> 2010-7-01  1726 3212 1428
>>>>> 2010-7-01  1726 3212 1428
>>>>> ...                318   1846 1012
>>>>> 2010-7-01  1726 3212 1428
>>>>>
>>>>> Can I assume that, for a certain day , the records for the same
>>>>> three combination are all together? There is just one set per day
>>>>> for a given combination?
>>>>>
>>>>> Or is it possible to have the same combination on one day with
>>>>> several sets?
>>>>>
>>>>> Best,
>>>>> Oliveiros
>>>>>
>>>>>
>>>>> ----- Original Message ----- From: "Rainer Stengele"
>>>>> <rainer.stengele@diplan.de>
>>>>> Newsgroups: gmane.comp.db.postgresql.sql
>>>>> To: "Oliveiros d'Azevedo Cristina" <oliveiros.cristina@marktest.pt>
>>>>> Cc: <>
>>>>> Sent: Thursday, July 29, 2010 10:41 AM
>>>>> Subject: Re: grouping subsets
>>>>>
>>>>>
>>>>>> Howdy Cristina,
>>>>>>
>>>>>> unfortunately things are more complicated. I have inserted an
>>>>>> excerpt of the real data here:
>>>>>>
>>>>>> ================================================================================
>>>>>>
>>>>>> TableID         MasterID dtBegin                           dtEnd
>>>>>> idR idL      idB     consumption
>>>>>> 4057312           295530 2010-07-01 00:59:21.077          
>>>>>> 2010-07-01 01:32:59.670           1726     3212     1428     279
>>>>>> 4061043           295574 2010-07-01 01:59:31.137          
>>>>>> 2010-07-01 02:32:09.373           1726     3212     1428     183
>>>>>> 4083397           295838 2010-07-01 07:57:51.327          
>>>>>> 2010-07-01 08:28:28.117           318      1846     1012     30
>>>>>> 4090858           295920 2010-07-01 09:52:33.777          
>>>>>> 2010-07-01 10:31:34.393           318      1846     1012     487
>>>>>> 4094589           295961 2010-07-01 10:47:59.370          
>>>>>> 2010-07-01 11:32:20.903           318      1846     1012     472
>>>>>> 4098330           296013 2010-07-01 11:58:53.890          
>>>>>> 2010-07-01 12:31:35.730           318      1846     1012     195
>>>>>> 4102069           296058 2010-07-01 12:36:19.170          
>>>>>> 2010-07-01 13:32:13.950           318      1846     1012     338
>>>>>> 4105809           296102 2010-07-01 13:58:53.170          
>>>>>> 2010-07-01 14:02:57.710           318      1846     1012     105
>>>>>> 4109555           296150 2010-07-01 14:59:11.663          
>>>>>> 2010-07-01 15:32:33.810           318      1846     1012     187
>>>>>> 4113305           296194 2010-07-01 15:59:01.797          
>>>>>> 2010-07-01 16:02:27.260           318      1846     1012     108
>>>>>> 4117048           296238 2010-07-01 16:20:47.997          
>>>>>> 2010-07-01 17:32:49.367           318      1846     1012     179
>>>>>> 4120791           296282 2010-07-01 17:58:27.657          
>>>>>> 2010-07-01 18:29:01.733           318      1846     1012     256
>>>>>> 4128291           296370 2010-07-01 19:54:17.687          
>>>>>> 2010-07-01 20:32:53.850           318      1846     1012     239
>>>>>> 4132044           296413 2010-07-01 20:31:37.653          
>>>>>> 2010-07-01 21:29:13.497           318      1846     1012     39
>>>>>> 4135797           296458 2010-07-01 21:59:13.983          
>>>>>> 2010-07-01 22:32:46.503           318      1846     1012     157
>>>>>> 4139572           296506 2010-07-01 22:58:49.530          
>>>>>> 2010-07-01 23:32:22.543           318      1846     1012     218
>>>>>> 4142941           296554 2010-07-01 23:59:13.857          
>>>>>> 2010-07-02 00:32:30.390           318      1846     1012     248
>>>>>> 4146289           296598 2010-07-02 00:58:55.763          
>>>>>> 2010-07-02 01:32:41.983           318      1846     1012     204
>>>>>> 4149616           296642 2010-07-02 01:46:57.357          
>>>>>> 2010-07-02 02:32:56.983           318      1846     1012     42
>>>>>> 4152952           296686 2010-07-02 02:55:19.653          
>>>>>> 2010-07-02 03:32:28.013           318      1846     1012     135
>>>>>> 4156289           296730 2010-07-02 03:43:52.777          
>>>>>> 2010-07-02 04:32:55.250           318      1846     1012     743
>>>>>> 4159624           296774 2010-07-02 04:43:15.310          
>>>>>> 2010-07-02 05:32:44.547           318      1846     1012     277
>>>>>> 4162961           296817 2010-07-02 05:58:59.483          
>>>>>> 2010-07-02 06:32:37.340           318      1846     1012     121
>>>>>> 4166303           296862 2010-07-02 06:58:50.733          
>>>>>> 2010-07-02 07:32:39.113           318      1846     1012     239
>>>>>> 4172981           296950 2010-07-02 07:28:55.293          
>>>>>> 2010-07-02 09:33:01.200           318      1846     1012     512
>>>>>> 4176322           296993 2010-07-02 09:59:04.607          
>>>>>> 2010-07-02 10:33:01.903           318      1846     1012     139
>>>>>> 4179667           297038 2010-07-02 10:55:27.760          
>>>>>> 2010-07-02 11:32:56.560           318      1846     1012     722
>>>>>> 4183012           297082 2010-07-02 11:59:33.650          
>>>>>> 2010-07-02 12:32:14.700            318      1846     1012     163
>>>>>> 4186351           297126 2010-07-02 12:23:45.997          
>>>>>> 2010-07-02 13:32:59.500            318      1846     1012     284
>>>>>> 4189689           297169 2010-07-02 13:44:21.253          
>>>>>> 2010-07-02 14:18:05.080            318      1846     1012     254
>>>>>> 4196371           297258 2010-07-02 16:16:19.123          
>>>>>> 2010-07-02 16:32:53.437           1706     3541     1511     161
>>>>>> 4199720           297301 2010-07-02 16:59:35.127          
>>>>>> 2010-07-02 17:32:57.950           1706     3541     1511     250
>>>>>> 4203068           297346 2010-07-02 17:59:34.027          
>>>>>> 2010-07-02 18:32:54.337           1706     3541     1511     302
>>>>>> 4206413           297389 2010-07-02 18:59:28.730          
>>>>>> 2010-07-02 19:32:37.950           1706     3541     1511     276
>>>>>> 4209758           297434 2010-07-02 19:54:00.243          
>>>>>> 2010-07-02 20:32:57.433           1706     3541     1511     209
>>>>>> 4213102           297473 2010-07-02 20:49:10.963          
>>>>>> 2010-07-02 21:30:44.540           1706     3541     1511     76
>>>>>> 4216447           297511 2010-07-02 21:59:34.810          
>>>>>> 2010-07-02 22:33:00.603           1706     3541     1511     287
>>>>>> 4219818           297569 2010-07-02 22:56:52.750          
>>>>>> 2010-07-02 23:59:31.607           1706     3541     1511     1877
>>>>>> 4219819           297570 2010-07-02 23:59:21.577          
>>>>>> 2010-07-03 00:54:40.153           1706     3541     1511     1798
>>>>>> 4219821           297572 2010-07-03 00:48:03.310          
>>>>>> 2010-07-03 01:59:37.920           1706     3541     1511     1125
>>>>>> 4219823           297574 2010-07-03 01:51:01.057          
>>>>>> 2010-07-03 02:59:45.433           1706     3541     1511     1629
>>>>>> 4219820           297571 2010-07-03 02:59:29.393          
>>>>>> 2010-07-03 03:59:54.920           1706     3541     1511     2462
>>>>>> 4219822           297573 2010-07-03 03:59:18.663          
>>>>>> 2010-07-03 04:01:48.810           1706     3541     1511     70
>>>>>> 4225738           297656 2010-07-03 06:13:34.980          
>>>>>> 2010-07-03 06:28:09.697           1726     3212     1428     46
>>>>>> 4228694           297695 2010-07-03 06:59:15.560          
>>>>>> 2010-07-03 07:32:45.653           1726     3212     1428     251
>>>>>> 4231649           297733 2010-07-03 07:59:11.937          
>>>>>> 2010-07-03 08:32:57.217           1726     3212     1428     284
>>>>>> 4234604           297771 2010-07-03 08:57:00.357          
>>>>>> 2010-07-03 09:32:47.903           1726     3212     1428     227
>>>>>> 4237559           297809 2010-07-03 09:59:19.813          
>>>>>> 2010-07-03 10:33:02.063           1726     3212     1428     285
>>>>>> 4261156           298596 2010-07-04 22:59:09.863          
>>>>>> 2010-07-04 23:33:45.530           1726     3212     1428     1286
>>>>>> 4264114           298646 2010-07-04 23:59:16.967          
>>>>>> 2010-07-05 00:33:08.107           1726     3212     1428     297
>>>>>> 4267067           298690 2010-07-05 00:59:15.187          
>>>>>> 2010-07-05 01:32:48.300           1726     3212     1428     333
>>>>>> 4270023           298734 2010-07-05 01:59:02.497          
>>>>>> 2010-07-05 02:32:48.780           1726     3212     1428     270
>>>>>> 4272977           298778 2010-07-05 02:41:43.737          
>>>>>> 2010-07-05 03:32:56.043           1726     3212     1428     317
>>>>>> 4275927           298822 2010-07-05 03:59:17.027          
>>>>>> 2010-07-05 04:33:14.947           1726     3212     1428     1623
>>>>>> ================================================================================
>>>>>>
>>>>>>
>>>>>> Description:
>>>>>> 1. Column: some ID
>>>>>> 2. Column: reference to another table
>>>>>> 3. and 4. column: timestamp from/to of the item
>>>>>> 5. Column: ID R
>>>>>> 6. Column: ID L
>>>>>> 7. Column: ID B
>>>>>> 8. Column: Sum of components
>>>>>>
>>>>>> Requirement:
>>>>>> Sum over all components (from column 8) for each combination of
>>>>>> ID R, ID L, ID B, but (!)
>>>>>> rows with same keys (R,L,B) should be summed up only until the
>>>>>> keys change.
>>>>>> Do not sum up the components for identical keys, if there are
>>>>>> other keys between them.
>>>>>>
>>>>>> Example result:
>>>>>>
>>>>>> idR       idL      idB                 SUM
>>>>>> 1726     3212     1428                 462
>>>>>> 318     1846     1012                 ...
>>>>>> 1706     3541     1511                 ...
>>>>>> 1726     3212     1428                 ...
>>>>>>
>>>>>>
>>>>>> Note that the first and last entry here has the same keys
>>>>>>
>>>>>> Maybe you find a similar monster SQL solving such a requirement.
>>>>>> Thanks for considering!
>>>>>>
>>>>>> Rainer
>>>>>>
>>>>>>
>>>>>>
>>>>>> Am 27.07.2010 12:37, schrieb Oliveiros d'Azevedo Cristina:
>>>>>>> Howdy, Rainer.
>>>>>>>
>>>>>>> It's been a while, so I don't know if you are still interested
>>>>>>> in this problem or if you, in the meantime, found yourself a
>>>>>>> solution,
>>>>>>> but I've tried this on a local copy of the example you
>>>>>>> provided   and it seems to work.
>>>>>>>
>>>>>>> The problem is that I suspect that if you have several thousands
>>>>>>> of records on your table it will become slow...
>>>>>>>
>>>>>>> Best,
>>>>>>> Oliveiros
>>>>>>>
>>>>>>> SELECT SUM(tudo.parcela),tudo.a
>>>>>>> FROM
>>>>>>> (
>>>>>>> SELECT fo.parcela,fo.a,fo.b,fo.c,MIN(th.c) as d
>>>>>>> FROM
>>>>>>> (
>>>>>>> SELECT se.a as parcela,se.b as a,se.c as b, MAX(pr.c) as c
>>>>>>> FROM
>>>>>>> yourTable se
>>>>>>> LEFT JOIN
>>>>>>> (
>>>>>>> SELECT a.*
>>>>>>> FROM yourTable a
>>>>>>> JOIN yourTable b
>>>>>>> ON (b.b <> a.b)
>>>>>>> AND ((age(a.c,b.c) = '1 day'::interval)
>>>>>>>
>>>>>>> )
>>>>>>> ) pr
>>>>>>> ON pr.b = se.b
>>>>>>> AND    se.c >= pr.c
>>>>>>> GROUP BY se.a,se.b,se.c
>>>>>>> ) fo
>>>>>>> LEFT JOIN
>>>>>>> (
>>>>>>> SELECT a.*
>>>>>>> FROM yourTable a
>>>>>>> JOIN yourTable b
>>>>>>> ON (b.b <> a.b)
>>>>>>> AND ((age(a.c,b.c) = '-1 day'::interval)
>>>>>>> )
>>>>>>> ) th
>>>>>>> ON fo.a = th.b
>>>>>>> AND fo.b <= th.c
>>>>>>> GROUP BY fo.parcela,fo.a,fo.b,fo.c
>>>>>>> ) tudo
>>>>>>> GROUP BY tudo.a,tudo.c,tudo.d
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> To: <pgsql-sql@postgresql.org>
>>>>>>> Sent: Thursday, July 22, 2010 9:09 AM
>>>>>>> Subject: [SQL] grouping subsets
>>>>>>>
>>>>>>>
>>>>>>>> Hi,
>>>>>>>>
>>>>>>>> having a table similar to
>>>>>>>>
>>>>>>>> | 1 | B | [2010-07-15 Do] |
>>>>>>>> | 1 | B | [2010-07-16 Fr] |
>>>>>>>> |---+---+-----------------|
>>>>>>>> | 2 | C | [2010-07-17 Sa] |
>>>>>>>> | 2 | C | [2010-07-18 So] |
>>>>>>>> |---+---+-----------------|
>>>>>>>> | 1 | B | [2010-07-19 Mo] |
>>>>>>>> | 1 | B | [2010-07-20 Di] |
>>>>>>>> | 1 | B | [2010-07-21 Mi] |
>>>>>>>> | 1 | B | [2010-07-22 Do] |
>>>>>>>> |---+---+-----------------|
>>>>>>>> | 3 | D | [2010-07-23 Fr] |
>>>>>>>>
>>>>>>>> a simple group by gives me:
>>>>>>>>
>>>>>>>> | 6 | B |
>>>>>>>> | 4 | C |
>>>>>>>> | 3 | D |
>>>>>>>>
>>>>>>>>
>>>>>>>> What I want to get is the values grouped by "subset", where a
>>>>>>>> subset is a set of rows with identical column until the colum
>>>>>>>> changes.
>>>>>>>> Is there a way to get
>>>>>>>>
>>>>>>>> | 2 | B |
>>>>>>>> | 4 | C |
>>>>>>>> | 4 | B |
>>>>>>>> | 3 | D |
>>>>>>>>
>>>>>>>> by SQL only?
>>>>>>>>
>>>>>>>> - Rainer
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> -- 
>>>>>>>> Sent via pgsql-sql mailing list (pgsql-sql@postgresql.org)
>>>>>>>> To make changes to your subscription:
>>>>>>>> http://www.postgresql.org/mailpref/pgsql-sql
>>>>>>>
>>>>>>>
>>>>>
>>>
>>>
>




^ permalink  raw  reply  [nested|flat] 16+ messages in thread


end of thread, other threads:[~2010-07-31 19:48 UTC | newest]

Thread overview: 16+ messages (download: mbox mbox.gz follow: Atom feed)
-- links below jump to the message on this page --
2010-07-22 08:09 grouping subsets Rainer Stengele <rainer.stengele@diplan.de>
2010-07-22 10:02 ` A. Kretschmer <andreas.kretschmer@schollglas.com>
2010-07-22 10:53   ` Richard Huxton <dev@archonet.com>
2010-07-22 11:31     ` Tim Landscheidt <tim@tim-landscheidt.de>
2010-07-30 15:58       ` Joshua Tolley <eggyknap@gmail.com>
2010-07-22 13:18 ` Oliveiros d'Azevedo Cristina <oliveiros.cristina@marktest.pt>
2010-07-22 13:25   ` Rainer Stengele <rainer.stengele@diplan.de>
2010-07-22 14:18     ` Tim Landscheidt <tim@tim-landscheidt.de>
2010-07-27 10:37 ` Oliveiros d'Azevedo Cristina <oliveiros.cristina@marktest.pt>
2010-07-29 09:41   ` Rainer Stengele <rainer.stengele@diplan.de>
2010-07-29 11:47     ` Oliveiros d'Azevedo Cristina <oliveiros.cristina@marktest.pt>
2010-07-29 12:10       ` Rainer Stengele <rainer.stengele@diplan.de>
2010-07-29 13:31         ` Oliveiros d'Azevedo Cristina <oliveiros.cristina@marktest.pt>
2010-07-30 09:35           ` Rainer Stengele <rainer.stengele@diplan.de>
2010-07-30 15:07             ` Oliveiros d'Azevedo Cristina <oliveiros.cristina@marktest.pt>
2010-07-31 19:48               ` Rainer Stengele <rainer.stengele@diplan.de>

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox