[SQL] Special grouping on sorted data.

2008-09-22 Thread Nicolas Beuzeboc

Hi,

I was looking for a simple solution to this problem. I can't find a way 
to group on b and n by just collapsing sequential n's (identical n's 
right next to each other) the sorting condition is the timestamp.


b| n  | stamp

A| 1  | 2008-09-20 06:07:47.981445
A| 1  | 2008-09-20 06:08:13.294306
A| 1  | 2008-09-20 06:12:02.046596
A| 2  | 2008-09-20 06:12:26.267786
A| 2  | 2008-09-20 06:12:47.750429
A| 1  | 2008-09-20 06:13:12.152512
A| 2  | 2008-09-20 06:13:39.052528
A| 2  | 2008-09-20 06:14:12.875389
B| 1  | 2008-09-20 06:14:29.963352
B| 1  | 2008-09-20 06:14:52.247307
B| 3  | 2008-09-20 06:15:13.358151
B| 3  | 2008-09-20 06:15:44.307792
B| 3  | 2008-09-20 06:16:17.32131
B| 2  | 2008-09-20 06:16:44.030435
B| 2  | 2008-09-20 06:17:00.140907
C| 1  | 2008-09-20 06:17:50.067258
C| 1  | 2008-09-20 06:18:22.280218
C| 1  | 2008-09-20 06:18:41.661213
C| 1  | 2008-09-20 06:19:07.920327
C| 3  | 2008-09-20 06:19:26.166675
C| 2  | 2008-09-20 06:19:46.459439
C| 2  | 2008-09-20 06:20:04.634328

Here I give an example of the output I'm looking for, And I can find a 
way to do that in crystal report, but I would like postgresql to send it 
that way. If the next n is different create a new row.


 b| n  |min_stamp   | max_stamp
-
 A| 1  | 2008-09-20 06:07:47.981445 | 2008-09-20 06:12:02.046596
 A| 2  | 2008-09-20 06:12:26.267786 | 2008-09-20 06:12:47.750429
 A| 1  | 2008-09-20 06:13:12.152512 | 2008-09-20 06:13:12.152512
 A| 2  | 2008-09-20 06:13:39.052528 | 2008-09-20 06:14:12.875389
 B| 1  | 2008-09-20 06:14:29.963352 | 2008-09-20 06:14:52.247307
 B| 3  | 2008-09-20 06:15:13.358151 | 2008-09-20 06:16:17.32131
 B| 2  | 2008-09-20 06:16:44.030435 | 2008-09-20 06:17:00.140907
 C| 1  | 2008-09-20 06:17:50.067258 | 2008-09-20 06:19:07.920327
 C| 3  | 2008-09-20 06:19:26.166675 | 2008-09-20 06:19:26.166675
 C| 2  | 2008-09-20 06:19:46.459439 | 2008-09-20 06:20:04.634328

If I write a GROUP BY b,n there is going to be only two rows for b = 
'A', if I use distinct on i get the same thing


is there an easy way to do that ?

Nicolas




--
Sent via pgsql-sql mailing list (pgsql-sql@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-sql


Re: [SQL] Special grouping on sorted data.

2008-09-23 Thread Nicolas Beuzeboc

Craig Ringer wrote:


b| n  | stamp

A| 1  | 2008-09-20 06:07:47.981445 [1]
A| 1  | 2008-09-20 06:08:13.294306 [1]
A| 1  | 2008-09-20 06:12:02.046596 [1]
A| 2  | 2008-09-20 06:12:26.267786 [2]
A| 2  | 2008-09-20 06:12:47.750429 [2]
A| 1  | 2008-09-20 06:13:12.152512 [3]
A| 2  | 2008-09-20 06:13:39.052528 [4]
A| 2  | 2008-09-20 06:14:12.875389 [4]



I'd be tempted to use a set-returning PL/PgSQL function to process an 
input set ordered by stamp and return a result whenever the (b,n) pair 
changed. I'm sure there's a cleverer set-oriented approach, but it's 
eluding me at present.


You need a way to express the notion of "contiguous runs of (b,n)" 
which doesn't really exist in (set-oriented) SQL.


The numbers you have next to each row is exactly what I'm looking for. 
You mention PL/PgSQL, I'm familiar with creating triggered procedures so 
I'll look into that


I suspect that Crystal Reports may be pulling the whole data set from 
PostgreSQL then doing its processing client-side.
Crystal report is running a simple pass through query that I wrote, 
select b.n.stamp from table where stamp  order by stamp
Then I use its grouping features, I group by b, then n but when I group 
by n I don't specify ascending or descending order but "in original order"

And it ends up doing what I'm looking for.

I which distinct on was more flexible, it's not happy when the order by 
set is different than the distinct on set.


I would like to be able to write select distinct on (b,n) b,n,stamp from 
table where ... order by stamp;


Nicolas



--
Sent via pgsql-sql mailing list (pgsql-sql@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-sql


Re: [SQL] Special grouping on sorted data.

2008-09-23 Thread Nicolas Beuzeboc

I which distinct on ...
I wish distinct on ...

--
Sent via pgsql-sql mailing list (pgsql-sql@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-sql