2017-06-21 2 views
1

Ich versuche, einen Bericht zu erstellen, der das Datum aus einer vorherigen Zeile zieht, einige Berechnungen ausführt und dann die Antwort in der Zeile unter dieser Zeile anzeigt. Die fragliche Spalte ist "Zeit verbraucht".Verwenden eines Werts aus einer vorherigen Zeile, um einen Wert in der nächsten Zeile zu berechnen

z. Ich habe 3 Reihen.

 
+=====+===============+============+====+ 
|name | DatCompleted | Time Spent | idx| 
+=====+===============+============+====+ 
| A | 1/1/17  | NULL  | 0 | 
+-----+---------------+------------+----+ 
| B | 11/1/17 | 10 days | 1 | 
+-----+---------------+------------+----+ 
| C | 20/1/17 | 9 days  | 2 | 
+=====+===============+============+====+ 

Benötigte Zeit C = DatCompleted von C - DateCompleted von B

Neben einer verrückten Schleife verwenden und Zeile x Zeile statt Satz verwendet, kann ich nicht sehen, wie ich dieses vollenden würde. Hat jemand diese Logik jemals in SQL verwendet? Wie bist du dazu gekommen?

Vielen Dank im Voraus!

+1

Verwenden Sie die 'Verzögerung()' Funktion: –

+1

Bitte markieren Sie den tatsächlichen RDBMS (Produkt und Version) und lesen Sie bitte [Wie eine gute SQL Frage stellen] (http://meta.stackoverflow.com/ questions/271055/tips-for-a-sell-structured-query-language-sql-question/271056) und [Wie man ein MCVE erstellt] (http://stackoverflow.com/help/mcve) – Shnugo

Antwort

4

Die meisten Datenbanken unterstützen den ANSI-Standard LAG() Funktion verwenden können. Datumsfunktionen unterscheiden sich je nach der Datenbank, aber so etwas wie dies:

select t.*, 
     (DateCompleted - lag(DateCompleted) over (order by DateCompleted)) as TimeSpent 
from t; 

In SQL Server, würden Sie datediff() verwenden:

select t.*, 
     datediff(day, 
       lag(DateCompleted) over (order by DateCompleted), 
       DateCompleted 
       ) as TimeSpent 
from t; 
+0

Das hat perfekt funktioniert. Vielen Dank!! –

1

Sie diese Zeilennummer Syntax tun kann durch die Verwendung ist

ROW_NUMBER () OVER ([ PARTITION BY value_expression , ... [ n ] ] order_by_clause) 

als Referenz Sie ROW_NUMBER

+0

können Sie Bitte geben Sie ein Beispiel für ein gegebenes Problem an. –

1

Sie haben einen Index bereits (ähnlich oben auf RowNumber). Sich mit sich selbst verbinden.

Select table1.* 
    ,TimeSpent=DateDiff("d",table1.DateCompleted,copy.DateCompleted) 
from table1 
    join table1 copy on table.idx=copy.idx-1 
Verwandte Themen