2016-11-09 14 views
2

PROBLEMOracle 11g - SQL-Zeitdifferenz zwischen mehreren Reihen

ich noch zu ermitteln bin meine Füße mit SQL zu finden und zu berechnen versucht, wie lange ein bestimmter Benutzer Gegenstände bei ihrer Verschiebung Scannen wurde.

Jeder Scan Timestamped wird eine eindeutige Sequenznummer 9 digit Erzeugen (SEQ Spalte) und Datum/Uhrzeit im Format 05-NOV-16 15:35:24 (the_date Spalte).

Die Person scannt möglicherweise mehrere Stunden, und was ich versuche, ist, den ersten Zeitstempel, den sie generiert haben, vom letzten Zeitstempel am Ende der Schicht abzuziehen.

So zum Beispiel angesichts dieser Daten Beispiel:

+-----------+--------------------+--------+---------+---------+------------+-----------+ 
| SEQ |  THE_DATE  | SCANID | LOCATN | USER_ID | FIRST_NAME | LAST_NAME | 
+-----------+--------------------+--------+---------+---------+------------+-----------+ 
| 103939758 | 05-NOV-16 14:36:22 | 194972 | DOOR 19 | AX9868 | Mike  | Derry  | 
| 103939780 | 05-NOV-16 14:38:07 | 194972 | DOOR 19 | AX9868 | Mike  | Derry  | 
| 103939792 | 05-NOV-16 14:39:24 | 194972 | DOOR 19 | AX9868 | Mike  | Derry  | 
| 103940184 | 05-NOV-16 15:16:53 | 194972 | DOOR 19 | AX9868 | Mike  | Derry  | 
| 103940185 | 05-NOV-16 15:51:41 | 194972 | DOOR 19 | AX9868 | Mike  | Derry  | 
| 103940214 | 05-NOV-16 09:51:42 | 194993 | DOOR 16 | BC1910 | Tony  | McCann | 
| 103940215 | 05-NOV-16 15:19:06 | 194993 | DOOR 16 | BC1910 | Tony  | McCann | 
|+-----------+--------------------+--------+---------+---------+------------------------ 

Gewünschtes Ergebnis

Ich mag würde den Zeitstempel in der ersten Reihe für Mike Derry, aus der letzten Reihe subtrahieren, auf dem er erscheint , Zeile 5 in diesem Fall, so dass ich eine Antwort in Stunden (1,25) habe.

Das Endergebnis sollte nach Tag und nach user_id, first_name und last_name gruppiert werden.

Bisher habe ich online und bei der Orakeldokumentation geschaut, was mich dazu brachte, die LEAD-Funktion zu versuchen, die vielversprechend schien. In den nächsten Zeilen wird nach dem nächsten Zeitstempel gesucht, an dem eine Benutzer-ID als nächstes angezeigt wird, und anschließend nach Partitionen mit dieser Benutzer-ID, um eine neue Spalte mit diesem Zeitstempel zu erstellen.

So sah der SQL diese wie

SELECT SEQ, THE_DATE,SCANID,LOCATN,USER_ID,LEAD(SYSDAT) OVER (PARTITION BY USER_ID ORDER BY SYSDAT) AS NEXT_SCAN 
FROM myTable... 

dies jedoch ist mir falsche Ergebnisse geben, da sie die Zeitdifferenz zählen zu verdoppeln scheint. Ich bin sicher, Sie SQL-Gurus haben einen eleganteren Weg, um dieses, wie ich glaube nicht, diese Funktion passt dieses spezielle Problem :)

Also das Endergebnis im erreichen versuchen, ist:

+-----------+---------+------------+-----------+-----------+ 
| THE_DATE | USER_ID | FIRST_NAME | LAST_NAME | TOTAL_HRS | 
+-----------+---------+------------+-----------+-----------+ 
| 05-NOV-16 | AX9868 | Mike  | Derry  |  1.25 | 
| 05-NOV-16 | BC1910 | Tony  | McCann |  5.47 | 
+-----------+---------+------------+-----------+-----------+ 

Ihre Hilfe ist viel

geschätzt
+1

welcher Typ ist 'THE_DATE'? Timestamp oder Varchar? –

+0

hallo ist ein DATE-Typ. danke – Nick

Antwort

0
SELECT TRUNC(THE_DATE) as THE_DATE, USER_ID, FIRST_NAME, LAST_NAME, 
     MAX(THE_DATE) - MIN(THE_DATE) as TOTAL_HRS 
FROM yourTable 
GROUP BY TRUNC(THE_DATE), USER_ID, FIRST_NAME, LAST_NAME 
+2

'to_date()' wird seltsame (und oft falsche) Ergebnisse erzeugen, wenn sie auf ein Datum angewendet werden. Datumsdifferenzen in Oracle sind in Tagen und das OP benötigt es in Stunden. Außerdem erzeugt diese Abfrage Gruppen von jeweils genau einer Zeile aus den Eingabedaten. – mathguy

+0

@mathguy können Sie erarbeiten, was Sie seltsam und falsches Ergebnis bedeuten? Ich kann das Ergebnis in Stunden umrechnen. Aber warum meinst du "eine Reihe", "Im" Gruppe mit "THE_DATE" und "USER_ID", also solltest du eine Zeile für Tag und Benutzer bekommen. –

+1

'to_date()' nimmt ein STRING-Argument und konvertiert es in ein Datum.Wenn Sie ein DATE-Argument übergeben, wird es unter Verwendung Ihrer NLS_DATE_FORMAT-Einstellungen in eine Zeichenfolge umgewandelt und anschließend in ein Datum zurückkonvertiert. Zum Beispiel, wenn Ihr NLS_DATE_FORMAT 'JJJJ-MM-TT hh24: mi' ist, wird es Sekunden usw. abschneiden. Dann: Das_Datum ist in allen Zeilen unterschiedlich, wenn Sie also nach ihm gruppieren, wird es keine "Gruppen" geben Die erste Reihe wird in einer anderen Gruppe sein. – mathguy

2

Hinweise .... Sie sollten nicht redundante Daten (Vorname, Nachname) haben in dieser Tabelle sollten Sie eine separate Tabelle haben nur dafür. Es scheint, deine Stunden sind abgeschnitten und nicht abgerundet? (Die Rundung würde 1,26 in der ersten Reihe ergeben).

with 
    test_data (seq, the_date, scanid, locatn, user_id, first_name, last_name) as (
     select 103939758, to_date('05-NOV-16 14:36:22', 'dd-MON-yy hh24:mi:ss'), 194972, 'DOOR 19', 'AX9868', 'Mike', 'Derry' from dual union all 
     select 103939780, to_date('05-NOV-16 14:38:07', 'dd-MON-yy hh24:mi:ss'), 194972, 'DOOR 19', 'AX9868', 'Mike', 'Derry' from dual union all 
     select 103939792, to_date('05-NOV-16 14:39:24', 'dd-MON-yy hh24:mi:ss'), 194972, 'DOOR 19', 'AX9868', 'Mike', 'Derry' from dual union all 
     select 103940184, to_date('05-NOV-16 15:16:53', 'dd-MON-yy hh24:mi:ss'), 194972, 'DOOR 19', 'AX9868', 'Mike', 'Derry' from dual union all 
     select 103940185, to_date('05-NOV-16 15:51:41', 'dd-MON-yy hh24:mi:ss'), 194972, 'DOOR 19', 'AX9868', 'Mike', 'Derry' from dual union all 
     select 103940214, to_date('05-NOV-16 09:51:42', 'dd-MON-yy hh24:mi:ss'), 194993, 'DOOR 16', 'BC1910', 'Tony', 'McCann' from dual union all 
     select 103940215, to_date('05-NOV-16 15:19:06', 'dd-MON-yy hh24:mi:ss'), 194993, 'DOOR 16', 'BC1910', 'Tony', 'McCann' from dual 
    ) 
-- end of test data; solution (SQL query) begins below this line 
select trunc(the_date) as the_date, user_id, first_name, last_name, 
     trunc(24 * (max(the_date) - min(the_date)), 2) as total_hrs 
from test_data 
group by trunc(the_date), user_id, first_name, last_name 
; 

THE_DATE USER_ID FIRST_NAME LAST_NAME TOTAL_HRS 
--------- ------- ---------- --------- ---------- 
05-NOV-16 AX9868 Mike  Derry   1.25 
05-NOV-16 BC1910 Tony  McCann   5.45 
+0

Wissen Sie, wie Orakel Demo in [Rextester] (http://rexttester.com/EZMHT42189) ?? Ich bekomme einige Syntaxfehler und kann es nicht funktionieren –

+0

Tut mir leid, ich bin nicht vertraut mit Rextester (oder anderen Online-SQL-Abfrage-Tools); Für mein eigenes Lernen habe ich eine kostenlose Version von Oracle direkt auf meinen Rechner heruntergeladen und installiert. – mathguy

+0

OK, ich muss das vielleicht tun, um meine Abfragen zu testen. –