2016-07-19 7 views
1

Ich habe eine Tabelle wie folgt aus:Organisieren Datum/Zeit-Tabelle mit SQL - Postgres

id | date | date_time 
------------------------------------ 
1 | 2016-07-01 | 2016-07-01 06:00:00 
2 | 2016-07-01 | 2016-07-01 06:02:00 
3 | 2016-07-01 | 2016-07-01 06:01:00 
1 | 2016-07-01 | 2016-07-01 16:25:00 
2 | 2016-07-01 | 2016-07-01 18:04:00 
3 | 2016-07-01 | 2016-07-01 12:06:00 
3 | 2016-07-01 | 2016-07-01 17:57:00 

möchte ich so etwas wie dies mit Hilfe von SQL tun:

id | date | date_time1 | date_time2 | date_time3 
---------------------------------------------------------- 
1 | 2016-07-01 | 2016-07-01 06:00:00 | 2016-07-01 16:25:00 
2 | 2016-07-01 | 2016-07-01 06:02:00 | 2016-07-01 18:04:00  
3 | 2016-07-01 | 2016-07-01 06:01:00 | 2016-07-01 17:57:00 | 2016-07-01 17:57:00 

Die Tabelle zwei haben kann, drei oder viermal für jeden Tag. Ich habe versucht, etwas mit Postgres zu tun, aber ich hatte keine guten Ergebnisse.

Kann mir jemand helfen?

+0

Verwenden Sie 'ctrl-k' oder fügen Sie 4 Leerzeichen zum Formatieren von Code als Text hinzu. –

+0

Sie sollten' PIVOT' und wahrscheinlich 'Dinamic PIVOT' suchen. Sie sollten auch Ihren RDBMS-Namen angeben, damit wir Ihnen genauere Hilfe anbieten können. Bitte lesen Sie [** How-to-Ask **] (http://stackoverflow.com/help/how-to-ask) \t \t Und hier ist ein großartiger Ort, um [** START **] (http : //spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/) um zu erfahren, wie Sie die Qualität Ihrer Fragen verbessern und bessere Antworten erhalten. –

+0

@JuanCarlosOropeza sorry für Format-Code ... Ich habe nach PIVOT gesucht, aber es ist nur für SQL Server, nicht wahr? Ich arbeite mit Postgres und ich habe es auch mit MySQL versucht. – thiagofred

Antwort

3

Der schnellste Weg, um die Informationen zu erhalten, die Sie suchen, ist die PostgreSQL-integrierten Array- und Aggregationsfunktionen. Zum Beispiel kann die Abfrage:

SELECT id, the_date, ARRAY_AGG(the_timestamp ORDER BY the_timestamp) AS date_time FROM dtpair GROUP BY id, the_date; 

produziert etwas ziemlich nah an, was Sie angegeben haben (und vielleicht schon Ihr Problem lösen) und hat keine Begrenzung der Anzahl der Zeitstempel pro Tag.

Wenn Sie das genaue Format benötigen, wie Sie oben angegeben haben, können Sie den gleichen Ansatz verwenden, aber erschweren die Dinge ein wenig weiter mit einer verschachtelten Abfrage es wie so zu erhalten:

SELECT id, the_date, date_time[1] AS date_time1, date_time[2] AS date_time2, date_time[3] AS date_time3 FROM (SELECT id, the_date, ARRAY_AGG(the_timestamp ORDER BY the_timestamp) AS date_time FROM dtpair GROUP BY id, the_date) AS arrayquery; 

Hoffnung, das hilft.

+0

Es funktioniert gut. In der MySQL hatte ich für jede date_time am Tag eine Sequenz zwischen 1 und 4 erstellt und dann ein einfaches PIVOT erstellt. Aber dieses Beispiel ist sehr schnell. Ich danke dir sehr. – thiagofred