WHILE LOOP mit SELECT TIMERANGE

killer22

Neuer Benutzer
Beiträge
2
Hallo zusammen,

bin seit paar Tagen an einem Problem dran evtl. könnt ihr mir weiterhelfen. (google und alle andere Suchen ergaben leider nicht die richtige oder für mich verständliche Lösung)


Mein System Oracle Server Version: 10g

So nun zu meinem Problem ich habe eine Tabelle, die eine Spalte mit einem Zeitstempel im UNIX Format beinhaltet.

Konvertiert sieht die Ausgabe so aus.

DATUM
03/07/2017 06:45:30
03/07/2017 06:51:38
03/07/2017 07:08:46
03/07/2017 07:13:23
03/07/2017 07:26:30
03/07/2017 09:30:48
03/07/2017 09:31:45
03/07/2017 09:31:51
03/07/2017 11:33:57
03/07/2017 11:36:03
03/07/2017 11:38:08
03/07/2017 12:38:15
03/07/2017 12:39:11
03/07/2017 13:42:19
03/07/2017 13:42:26

Ich brauche die Summen (COUNT) aus einem Zeitbereich der vorlaufend Rolliert z.B.

Startzeit: 06:00 Uhr
Zeitbereich 10 Minuten

Meine gewünschte Ausgabe (wobei die … für Nullsetze stehen habe sie nicht Aufgeführt um den Beitrag nicht zu lang zu machen)


TIME COUNT
06:00 0
06:10 0
06:20 0
06:30 0
06:40 1
06:50 1
07:00 1
07:10 1
07:20 1

09:30 2

11:30 3

12:30 2

13:40 2


Im Prinzip muss ich eine Schleife und die Select Abfrage bauen und der Abfrage bei jedem Loop 300 Sekunden dazu addieren.

Ich danke schon mal im Vorraus!
 
Werbung:
Schleifen in Abfragen sind bäh.

Code:
test=*# select * from ts_werte ;
  ts   
----------------------------
 2017-03-28 18:20:54.702932
 2017-03-28 19:23:50.232868
 2017-03-28 23:25:29.1195
 2017-03-28 20:07:18.722951
 2017-03-28 23:09:46.905271
 2017-03-29 02:29:51.672855
 2017-03-29 00:07:06.978682
 2017-03-29 00:11:23.191953
 2017-03-29 07:21:14.592615
 2017-03-29 07:21:10.908652
 2017-03-28 18:20:56.526003
 2017-03-28 20:17:40.667368
 2017-03-28 22:47:53.347353
 2017-03-29 01:24:02.963262
 2017-03-29 05:02:45.853804
 2017-03-29 00:28:32.329728
 2017-03-29 01:44:24.354053
 2017-03-28 20:39:39.200283
 2017-03-28 19:59:40.854459
 2017-03-28 18:35:09.097553
 2017-03-28 18:21:10.036166
 2017-03-28 19:21:54.21033
 2017-03-28 20:30:06.499356
 2017-03-28 21:41:29.586484
 2017-03-29 04:29:24.304409
 2017-03-28 20:50:07.099584
 2017-03-29 01:50:56.179609
 2017-03-29 08:43:19.375118
 2017-03-29 13:55:09.444096
 2017-03-29 07:26:28.891374
(30 Zeilen)

test=*# select foo.time, count(1) from (select '2017-03-28 18:00:))'::timestamp + s * '15minutes'::interval as time from generate_series(1, 40) s(s)) foo left join ts_werte w on w.ts between foo.time and foo.time+'15minutes'::interval group by foo.time order by foo.time
;
  time  | count
---------------------+-------
 2017-03-28 18:15:00 |  3
 2017-03-28 18:30:00 |  1
 2017-03-28 18:45:00 |  1
 2017-03-28 19:00:00 |  1
 2017-03-28 19:15:00 |  2
 2017-03-28 19:30:00 |  1
 2017-03-28 19:45:00 |  1
 2017-03-28 20:00:00 |  1
 2017-03-28 20:15:00 |  1
 2017-03-28 20:30:00 |  2
 2017-03-28 20:45:00 |  1
 2017-03-28 21:00:00 |  1
 2017-03-28 21:15:00 |  1
 2017-03-28 21:30:00 |  1
 2017-03-28 21:45:00 |  1
 2017-03-28 22:00:00 |  1
 2017-03-28 22:15:00 |  1
 2017-03-28 22:30:00 |  1
 2017-03-28 22:45:00 |  1
 2017-03-28 23:00:00 |  1
 2017-03-28 23:15:00 |  1
 2017-03-28 23:30:00 |  1
 2017-03-28 23:45:00 |  1
 2017-03-29 00:00:00 |  2
 2017-03-29 00:15:00 |  1
 2017-03-29 00:30:00 |  1
 2017-03-29 00:45:00 |  1
 2017-03-29 01:00:00 |  1
 2017-03-29 01:15:00 |  1
 2017-03-29 01:30:00 |  1
 2017-03-29 01:45:00 |  1
 2017-03-29 02:00:00 |  1
 2017-03-29 02:15:00 |  1
 2017-03-29 02:30:00 |  1
 2017-03-29 02:45:00 |  1
 2017-03-29 03:00:00 |  1
 2017-03-29 03:15:00 |  1
 2017-03-29 03:30:00 |  1
 2017-03-29 03:45:00 |  1
 2017-03-29 04:00:00 |  1
(40 Zeilen)

habs nicht nachgeprüft, bin aber optimistisch ...
 
Hi,
danke für deine Antwort leider kann ich nicht viel damit anfangen. Kannst du mir die Funktion genau erläutern?

Code:
select foo.time, count(1)                                                                        // verstehe ich
from (select '2017-03-28 18:00:))'::timestamp + s * '15minutes'::interval as time                // verstehe ich nicht
from generate_series(1, 40) s(s)) foo left join ts_werte w on w.ts                              // verstehe ich nicht hier müsste eingetlich meine select Abfrage  in die from rein aber wo
between foo.time and foo.time+'15minutes'::interval                                            // verstehe ich nicht
group by foo.time order by foo.time                                                            // verstehe ich
 
Zuletzt bearbeitet:
Werbung:
ich erzeuge 'on-the-fly' mit generate_series() eine Tabelle

Code:
test=# select '2017-03-28 18:00:))'::timestamp + s * '15minutes'::interval as time from generate_series(1, 40) s(s);
  time   
---------------------
 2017-03-28 18:15:00
 2017-03-28 18:30:00
 2017-03-28 18:45:00
 2017-03-28 19:00:00
 2017-03-28 19:15:00
 2017-03-28 19:30:00
 2017-03-28 19:45:00
 2017-03-28 20:00:00
 2017-03-28 20:15:00
 2017-03-28 20:30:00
 2017-03-28 20:45:00
 2017-03-28 21:00:00
 2017-03-28 21:15:00
 2017-03-28 21:30:00
 2017-03-28 21:45:00
 2017-03-28 22:00:00
 2017-03-28 22:15:00
 2017-03-28 22:30:00
 2017-03-28 22:45:00
 2017-03-28 23:00:00
 2017-03-28 23:15:00
 2017-03-28 23:30:00
 2017-03-28 23:45:00
 2017-03-29 00:00:00
 2017-03-29 00:15:00
 2017-03-29 00:30:00
 2017-03-29 00:45:00
 2017-03-29 01:00:00
 2017-03-29 01:15:00
 2017-03-29 01:30:00
 2017-03-29 01:45:00
 2017-03-29 02:00:00
 2017-03-29 02:15:00
 2017-03-29 02:30:00
 2017-03-29 02:45:00
 2017-03-29 03:00:00
 2017-03-29 03:15:00
 2017-03-29 03:30:00
 2017-03-29 03:45:00
 2017-03-29 04:00:00
(40 Zeilen)

Deine Daten-Tabelle joine ich dann dagegen.
 
Zurück
Oben