Re: Joining time fields? - Mailing list pgsql-novice
From | Oliveiros d'Azevedo Cristina |
---|---|
Subject | Re: Joining time fields? |
Date | |
Msg-id | DB0CA4E4047347F8B338D22733B0F1DB@Moon Whole thread Raw |
In response to | Re: Joining time fields? ("Oliveiros d'Azevedo Cristina" <oliveiros.cristina@marktest.pt>) |
Responses |
Re: Joining time fields?
Re: Joining time fields? |
List | pgsql-novice |
Howdy, Bryan,
I am not familiar with many constructs you employed, like crossed, grouped and using.
What is the version of PostGreSQL you are using? I'm still using 8.3
If your query works and your print out does prove so, then you found James an elegant solution.
I'm an old dog but I must find the time to upgrade myself, I'm missing lots of constructs. I'm always trying to do queries with the concepts I know and I'm
aware that probably new versions bring new constructs that can make in one line what I do in 10 and in a much more efficient way.
It was good that you joined in and contributed.
Best,
Oliver
----- Original Message -----From: Bryan Lee NuseSent: Thursday, July 26, 2012 5:43 PMSubject: Re: [NOVICE] Joining time fields?Hello James,Here's an alternative query that I believe gets what you're asking for. It is less clever and succinct than the one Oliveiros suggested, but may be easier to scrutinize if you are carrying a lot of additional columns through to the resulting table (you don't need to GROUP BY a bunch of columns, as you did in the query you posted). Also, I'd suggest saving any WHERE clause for the outer query (no matter what your final code looks like), as that will help in trouble-shooting. Like Oliveiros's query, this one rests upon a cross join, and will therefore be slow if your tables are huge.Here's a self-contained test:CREATE TABLE table_one (date_time TIMESTAMP,letter char(1));CREATE TABLE table_two (date_time TIMESTAMP,letter char(1));INSERT INTO table_oneVALUES ('2012-06-23 11:43:26', 'A'),('2010-05-16 06:45:20', 'B'),('2000-01-04 15:57:01', 'C'),('1993-10-06 04:36:09', 'D');INSERT INTO table_twoVALUES ('2000-06-23 11:43:26', 'W'),('1994-05-16 06:45:20', 'X'),('2008-01-04 15:57:01', 'Y'),('1994-05-16 06:45:20', 'Z'); -- duplicate valueThe query. Two WITH queries, the first to perform the cross join, the second to aggregate the crossed table according to the minimum time interval. These two queries are then JOINed in the main query:WITHcrossed AS (SELECTA.date_time AS dt_a,A.letter AS let_a,B.date_time AS dt_b,B.letter AS let_b,@(extract(EPOCH FROM A.date_time - B.date_time)) AS intervalFROMtable_one A, table_two B),grouped AS (SELECT dt_a, min(interval) AS intervalFROM crossedGROUP BY dt_a)SELECT C.*FROMgrouped GLEFT JOINcrossed CUSING (dt_a, interval)ORDER BY dt_a;Here's the output (recovers the duplicate rows in table_two, as you specified) :dt_a | dt_b | interval---------------------+---------------------+-----------1993-10-06 04:36:09 | 1994-05-16 06:45:20 | 191885511993-10-06 04:36:09 | 1994-05-16 06:45:20 | 191885512000-01-04 15:57:01 | 2000-06-23 11:43:26 | 147591852010-05-16 06:45:20 | 2008-01-04 15:57:01 | 745300992012-06-23 11:43:26 | 2008-01-04 15:57:01 | 140989585(5 rows)Hope that is helpful...Bryan
pgsql-novice by date: