Estoy tratando de crear un informe que extraiga la fecha de una fila anterior, haga algunos cálculos y luego muestre la respuesta en la fila debajo de esa fila. La columna en cuestión es "Tiempo empleado".

P.ej. Tengo 3 filas

+=====+===============+============+====+
|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  |
+=====+===============+============+====+

Tiempo empleado C = Fecha completada de C - Fecha completada de B

Aparte de usar un bucle loco y usar fila x fila en lugar de conjunto, no puedo ver cómo completaría esto. ¿Alguien ha usado esta lógica antes en SQL? Si cómo hiciste esto?

¡Gracias de antemano!

1
John Doe 21 jun. 2017 a las 14:04

3 respuestas

La mejor respuesta

La mayoría de las bases de datos admiten la función ANSI estándar LAG(). Las funciones de fecha difieren según la base de datos, pero algo así:

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

En SQL Server, usaría datediff():

select t.*,
       datediff(day,
                lag(DateCompleted) over (order by DateCompleted), 
                DateCompleted
               ) as TimeSpent
from t;
4
Gordon Linoff 21 jun. 2017 a las 11:14

Puede hacer esto usando la sintaxis de número ROW es

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

Como referencia, puede usar ROW_NUMBER

1
Magnus 21 jun. 2017 a las 11:36

Ya tiene un índice (similar al número de rown anterior). Únete a sí mismo.

Select table1.*
   ,TimeSpent=DateDiff("d",table1.DateCompleted,copy.DateCompleted)
from table1
   join table1 copy on table.idx=copy.idx-1
1
KeithL 21 jun. 2017 a las 12:44