SQL Server - nueva columna con info fila anterior

 
Vista:

nueva columna con info fila anterior

Publicado por SUPER (10 intervenciones) el 03/11/2008 22:31:52
Estimados compañeros,
tengo el siguiente desafio

poseo una tabla del tipo

cliente fecha
a 1
a 3
a 4
b 2
b 5
c 1
c 2
c 5

que me dice cuando fue a comprar un cliente.
Ahora necesito sacar los dias que pasaron antes de comprar nuevamente es decir seria algo como

cliente fecha dias
a 1 0
a 3 2
a 4 1
b 2 0
b 5 3
c 1 0
c 2 1
c 5 3

no se como resolver esto.
se me ocurrio tratar de hacer una tabla donde aparezca la fecha anterior en una nueva columna para sacar los dias, pero esto es precisamente lo que me falta

cliente fecha fecha anterior
a 1
a 3 1
a 4 3
b 2
b 5 2
c 1
c 2 1
c 5 2

tiene alguien alguna solución para este tipo de problemas?!

espero sus respuestas y como siempre muchas gracias!!!
super!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:nueva columna con info fila anterior

Publicado por Jorge Morales (13 intervenciones) el 04/11/2008 00:30:15
Espero que esto te ayude

Update Tabla
set DiasPasadosUltimaCompra = (
Select Tabla.FechaCompra - max(FechaCompra)
from Tabla t1
where t1.Cliente = Tabla.Cliente
and t1.FechaCompra < Tabla.FechaCompra)

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:nueva columna con info fila anterior

Publicado por Super (10 intervenciones) el 04/11/2008 13:21:22
Estimado Jorge o quien lo sepa.
Me sale un error.

te comento que tengo las columnas
cliente, fecha y frecuencia (ademas de otras que no interesan para el ejercicio)
frecuencia en un principio es una columna con puros 0 que será en la que trabaje el update. (dias pasados ultima compra).

el error que me sale es

Mens. 515, Nivel 16, Estado 2, Línea 1
Cannot insert the value NULL into column 'frecuencia', table 'tempdb.dbo.#tmp0011____________________________________________________________________________________________________________0000000006D3'; column does not allow nulls. UPDATE fails.

y el comando que puse fue tal como lo dijiste.

Update #tmp0011
set frecuencia = (
Select #tmp0011.fecha - max(fecha)
from #tmp0011 a
where a.cliente = #tmp0011.cliente
and a.fecha < #tmp0011.fecha)

que puede estar pasando?

de antemano
muchisimas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:nueva columna con info fila anterior

Publicado por pacopaz (131 intervenciones) el 04/11/2008 21:54:10
puedes hacerlo con un sp que reciba los valores a insertar y hacer algo como esto:
Supuestos:
Los parámetros @IdCliente y @Fecha son los que insertarás, además de los otros y se espera que el campo de fecha y el parámetro sean tipo DateTime.

insert into Tabla
(IdCliente, Fecha, Diferencia)
(select
@IdCliente,
@Fecha,
IsNull(floor(convert(float, @Fecha)) - floor(convert(float, max(t.Fecha))), 0)
from Tabla t where t.IdCliente = @IdCliente)

El uso de IsNull es por que si el cliente ha comprado por primera vez, max(t.Fecha) devolverá un nulo y cualquier operación con ella devolvería nulos, así que se le pone un 0, según lo que describías al principio. Si no quieres que indique el 0 cuando sea la primera compra, no hace falta usar el IsNull.

Espero que te sirva.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar