SQL Server - Quedarme con el dato del ultimo registro

 
Vista:
sin imagen de perfil

Quedarme con el dato del ultimo registro

Publicado por Patricia (5 intervenciones) el 22/09/2016 22:41:36
Buenas noches, quería pediros ayuda porque tengo que sacar unos datos para ma;ana y no doy con la tecla.

Os pongo en contexto. Tengo una tabla la cual en una de las columnas tengo valores a NULL (StandarCost). Quiero que ese valor NULL se quede con el valor que tiene el máximo StandarCost. He intentado con cross apply y no me funciona.


Os pongo un ejemplo>

select b.*, a.StandardCost
from dbo.prueba b
cross apply (select top 1* from dbo.prueba
where productId=b.ProductID
order by StandardCost desc) a

Los valores reales son estos

ProductId StandardCost
707 12.0278
707 13.8782
707 NULL
708 12.0278
708 13.8782
708 NULL


Los valores que me salen son estos

ProductId StandardCost StandardCost
707 12.0278 13.8782 Necesito que sea 12.0278
707 13.8782 13.8782 Necesito que sea 13.8782
707 NULL 13.8782 Necesito que sea 13.8782
708 12.0278 13.8782
708 13.8782 13.8782
708 NULL 13.8782


EStoy trabajando con SQL Server Managament Studio 2012
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
Imágen de perfil de Isaias
Val: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

Quedarme con el dato del ultimo registro

Publicado por Isaias (4558 intervenciones) el 22/09/2016 23:38:48
¿Es una broma?

1
2
3
4
5
6
7
8
9
10
11
create table #StandarCost (ProductId int, StandardCost decimal (10,2))
insert into #StandarCost values(707, 12.0278)
,(707 ,13.8782)
,(707 ,NULL)
,(708 ,12.0278)
,(708 ,13.8782)
,(708 ,NULL);
 
SELECT ProductId,
CASE WHEN StandardCost IS null then LAG(StandardCost) OVER (ORDER BY ProductId) ELSE StandardCost END
FROM #StandarCost
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

Quedarme con el dato del ultimo registro

Publicado por Patricia (1 intervención) el 23/09/2016 10:06:21
Es que os habia puesto mal, uso la version 2008R2 por lo que no me deja utilizar LAG,
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
Imágen de perfil de Isaias
Val: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

Quedarme con el dato del ultimo registro

Publicado por Isaias (4558 intervenciones) el 23/09/2016 19:55:17
Hola Patricia

Este codigo, esta probado en SQL Server 2008 R2

¿Que hace?

Se "posiciona" en el ULTIMO REGISTRO de la serie (por ID, dependiendo del orden de la FECHA) y despues se "regresa" una posicion hacia "atras".
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
CREATE TABLE #temp
(
id INT,
fecha datetime
)
 
INSERT INTO #temp VALUES (900681,'01/04/2013')
INSERT INTO #temp VALUES (900681,'01/05/2013')
INSERT INTO #temp VALUES (900681,'01/06/2013')
INSERT INTO #temp VALUES (900525,'04/03/2010')
INSERT INTO #temp VALUES (900525,'01/02/2010')
INSERT INTO #temp VALUES (900526,'01/03/2010')
INSERT INTO #temp VALUES (900526,'01/04/2010')
INSERT INTO #temp VALUES (900526,'01/05/2010')
INSERT INTO #temp VALUES (900526,'01/06/2010')
 
SELECT * FROM(
SELECT ROW_NUMBER() OVER(partition BY id ORDER BY fecha) AS rn,* FROM #temp
) AS t1 LEFT JOIN
(SELECT ROW_NUMBER() OVER(partition BY id ORDER BY fecha) AS rn,* FROM #temp) AS t2 ON (t1.id=t2.id AND (t1.rn-1)=t2.rn)
WHERE t2.id IS NOT NULL AND CONVERT(VARCHAR(20),t1.rn) + '|' + CONVERT(VARCHAR(20),t1.id) IN (SELECT CONVERT(VARCHAR(20),MAX(rn))  + '|' + CONVERT(VARCHAR(20),id) FROM(
SELECT ROW_NUMBER() OVER(partition BY id ORDER BY fecha) AS rn,* FROM #temp) AS t1 GROUP BY id)
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
sin imagen de perfil

Quedarme con el dato del ultimo registro

Publicado por Patricia (5 intervenciones) el 30/09/2016 22:00:20
Muchas gracias al final hice un update de los registros quedándome con el último utilizando cross apply. Tengo más casos como estos, probare la opción que comentas. Mil 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