SQL Server - Eliminar primer registro consulta y más

 
Vista:
sin imagen de perfil

Eliminar primer registro consulta y más

Publicado por Javier (12 intervenciones) el 02/02/2018 10:07:04
Buenos días,

Tengo conocimientos muy básicos de SQL y necesito resolver lo siguiente:

En una consulta en la que obtengo datos entre dos fechas, necesito eliminar el primer resultado si "Value" = 650. La idea es que el primer registro tenga "Value" = 700, ya que lo siguiente que necesito es saber el número de registros que mantuvieron el "Value" = 700 menos de 10 segundos, entre 10 y 30 segundos, entre 30 segundos y 1 minuto, y más de un minuto. Teniendo el primer registro con "Value" = 700, el siguiente es "Value" = 650, y así se van alternando hasta el final, por lo que había pensado en hacer algo como Datediff entre un registro y el inmediatamente anterior para obtener el tiempo que está con "Value" = 700.

Paso una imagen de la vista, simplemente con la consulta del rango de fechas.

Espero puedan ayudarme.

Muchas gracias
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

Eliminar primer registro consulta y más

Publicado por Isaias (4558 intervenciones) el 02/02/2018 21:19:41
¿Cual es su motor de base de datos?
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

Eliminar primer registro consulta y más

Publicado por Javier (12 intervenciones) el 05/02/2018 08:20:40
Hola Isaías,

Utilizo Microsoft SQL Server 2012.

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
sin imagen de perfil

Eliminar primer registro consulta y más

Publicado por Javier (12 intervenciones) el 07/02/2018 09:54:23
Buenos días,

¿Nadie me orienta con este tema?

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

Eliminar primer registro consulta y más

Publicado por Isaias (4558 intervenciones) el 07/02/2018 17:41:28
Como NO CONOZCO ninguna instruccion que limite el primer registro a un filtro, lo que se me ocurre, generar una variable de tipo TABLA, colocas ahi tus registros, si el primero no cumple con tu condicion, lo ELIMINAS.

¿no?
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

Eliminar primer registro consulta y más

Publicado por Javier (12 intervenciones) el 07/02/2018 17:48:19
Hola Isaías,

Eso es lo que estaba pensando hacer. Crear una tabla temporal o algo así, en la que introducir los valores que me interesen. El problema es que mis conocimientos de SQL son muy limitados. La finalidad sería introducir registros ordenados por fecha, en los que tuviera una columna que me diera la diferencia de tiempo en segundos entre la fecha de un registro con Value = 700 y el inmediatamente siguiente con Value = 650.

Sería como coger la tabla que adjunté, quitando el primer registro si Value = 650 y los intermedios con Value = 0, poner todos los de Value = 700 con una columna más que fuera el tiempo que han estado con Value = 700 (que es la la diferencia de tiempo en segundos entre la fecha de un registro con Value = 700 y el inmediatamente siguiente con Value = 650)

Espero haberme explicado, más o menos.

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

Eliminar primer registro consulta y más

Publicado por Isaias (4558 intervenciones) el 07/02/2018 18:40:13
Pasame la descripcion de tu tabla (campos y tipos de dato) y si se puede, un ejemplo de los datos contenidos en dicha tabla.
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

Eliminar primer registro consulta y más

Publicado por Javier (12 intervenciones) el 08/02/2018 09:49:21
Hola,

Subo un par de imágenes de lo que me pides. En el ejemplo de datos de la tabla, se ve como el primer registro tiene Value = 650 y hacia el final hay otro con Value = 0. La finalidad es tener en cuenta los registros que tienen Value = 700, y el tiempo que se ha mantenido ese valor (hasta el siguiente registro con Value = 650). Como sólo hay un dato de fecha que indica cuándo tomó un valor u otro, lo que habría que hacer es una resta de la fecha del Value = 650 con el anterior que tenía Value = 700.

Espero que haya quedado más o menos claro.

Gracias.
Imagen_03
Imagen_04
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

Eliminar primer registro consulta y más

Publicado por Isaias (4558 intervenciones) el 08/02/2018 17:51:17
Excelente, solo que, para hacer pruebas, no voy a ponerme a capturar todos los datos que muestras, puedes enviarlos por lo menos en HOJA EXCEL.

Otra observacion, estoy asumiendo (segun los datos mostrados), se debe eliminar el primer registro de la lista (value = 650) y SIEMPRE, despues del value = 700, vendra un value=600, o bien, hasta encontrar un value = 0
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

Eliminar primer registro consulta y más

Publicado por Javier (12 intervenciones) el 08/02/2018 18:15:52
Hola Isaías,

El objetivo final es saber el tiempo que ha estado activo un registro con Value = 700. Esto se sabe mirando el DateTime del registro con Value = 700 y restándolo del DateTime del primer registro posterior con Value distinto de 700. Puede ser que tenga el valor 650 (será lo más normal), pero no descarto que pueda tener el valor 0.

Espero haberme explicado.

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

Eliminar primer registro consulta y más

Publicado por Isaias (4558 intervenciones) el 08/02/2018 19:32:44
¿Que pasa en este caso? (o que deberia pasar)




captura
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

Eliminar primer registro consulta y más

Publicado por Javier (12 intervenciones) el 09/02/2018 08:27:28
Hola Isaías,

En esto caso sólo hay que tener en cuenta la hora de comienzo del registro 2 con el Value = 700, y la hora del registro 3 con Value = 650 para saber el tiempo que estuvo activo el registro 2. El Value = 0 del registro 3 y el Value = 650 del registro 4, no los tengo en cuenta. Lo que interesa es cada vez que un registro tiene el Value = 700 y el inmediatamente posterior que pase a valer 0 ó 650 para determinar el tiempo que estuvo activo con Value = 700, haciendo la diferencia de sus DateTime.

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

Eliminar primer registro consulta y más

Publicado por Isaias (4558 intervenciones) el 09/02/2018 18:29:47
Veo que las decisiones a tomar SON COMPLETAMENTE SUYAS y no del motor de la base de datos, veamos, seria correcto entonces que yo hiciera un SELECT como el que sigue:

1
2
3
4
5
6
7
8
9
10
11
12
SELECT TOP (1000)*
  FROM [Test].[dbo].[tester]
  WHERE VALUE IN(0,700)
 
  SELECT TOP (1000)*
  FROM [Test].[dbo].[tester]
  WHERE VALUE IN(650)
  AND DateTime > (
  SELECT top 1 DateTime
  FROM [Test].[dbo].[tester]
  WHERE VALUE IN(0,700)
  order by DateTime)

Me mostraria dos conjuntos de datos:


captura

Si intentara UNIR ambos conjuntos de datos por solo la fecha yyyy-mm-dd y la hora hh:mm, el que tiene value 0 en el conjunto superior SE ELIMINARIA al no encontrar "empate" en el conjunto inferior, ahora bien, en el conjunto inferior tengo dos registros con:

2018-02-07 09:51:00.6390000
2018-02-07 09:51:35.6700000

¿Se deberia tomar el mas antiguo?

2018-02-07 09:51:35.6700000

¿Observa como "estamos" tomando las DECISIONES en base a un conjunto de datos, pero que tal vez con millones de registros tengamos algunas otras "complicaciones"?

En pocas palabras, NO HAY LOGICA, la estamos inventado a simple vista
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

Eliminar primer registro consulta y más

Publicado por Javier (12 intervenciones) el 12/02/2018 08:33:55
Sí, el tema es bastante complejo y puede que exista algún caso que no hayamos contemplado.

En el caso que comentas, se debería tomar el registro más antiguo del conjunto inferior (2018-02-07 09:51:35.6700000)
, ya que le corresponde el registro del conjunto superior con fecha y hora 2018-02-07 09:51:05.6860000. El otro registro del conjunto inferior con valor 2018-02-07 09:51:00.6390000 no valdría ya que es anterior en el tiempo al registro del conjunto superior (2018-02-07 09:51:05.6860000).

Ahora se me está ocurriendo si no se podría crear una tabla temporal igual a la que obtengo con la consulta de la variable que quiero entre dos fechas, pero añadiendo una columna al final cuyo resultado sea la diferencia de tiempo con el registro inmediatamente siguiente. Así creo que bastaría con consultar esa columna sólo en los registros con Value = 700. El único caso que se me ocurre que pueda fallar es si tuviera dos registros seguidos con Value = 700, pero creo que serían muy pocos y tampoco sería tan grave.

Un saludo
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

Eliminar primer registro consulta y más

Publicado por Javier (12 intervenciones) el 14/02/2018 10:29:53
Hola,

Voy avanzando poco a poco. He conseguido mediante el siguiente código, crear una tabla temporal y sacar la columna del tiempo y la del valor de la variable. Mi objetivo ahora es buscar cada registro que tenga el Value = 700, y si el inmediatamente posterior tiene un Value distinto de 700, calcular la diferencia en segundos entre el tiempo del registro con Value distinto de 700 y el inmediatamente anterior (cuyo Value = 700) y meterlo en otra tabla temporal o en una columna nueva en mi tabla temporal inicial.

Estoy haciendo pruebas pero no lo consigo. ¿Alguna sugerencia? Adjunto ejemplo.

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

Eliminar primer registro consulta y más

Publicado por Isaias (4558 intervenciones) el 14/02/2018 18:54:22
Con las consultas que le mande, solo bastaria OBTENER el registro mas antiguo de la segunda columna y unir ambas columnas por la fecha.....insisto, no veo logica real, solo estamos contruyendola en base a los datos que nos muestra en su consulta
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

Eliminar primer registro consulta y más

Publicado por Isaias (4558 intervenciones) el 14/02/2018 20:48:09
Analicemos este otro caso

DateTime----------------------------- TagName ---------------------------Value
2018-02-07 10:29:02.0300000 UBB_PreT_Status.i.i.CB144 700
2018-02-07 11:33:29.3580000 UBB_PreT_Status.i.i.CB144 700

2018-02-07 11:35:24.4520000 UBB_PreT_Status.i.i.CB144 650
2018-02-07 11:36:54.4670000 UBB_PreT_Status.i.i.CB144 650

Se "SUPONE" que el primer registro 700, deberia compararse con el primer registro 650, pero si la CONDICION es obtener la FECHA MAS ANTIGUA (MAX), entonces se eliminaria el primer registro y quedaria el que dice:

2018-02-07 11:36:54.4670000

Y entonces, ¿con quien comparar el ultimo registro de arriba con valor 700? (2018-02-07 11:33:29.3580000)

Y seguimos sacando logica, en base a los datos, todo indica que hay un mal diseño en la tabla.
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

Eliminar primer registro consulta y más

Publicado por Javier (12 intervenciones) el 15/02/2018 08:46:53
Hola Isaías,

Finalmente he conseguido lo que quería. En la imagen adjunta se ve el código y el resultado. Realmente el objetivo era conseguir el número de registros que cumplían que su tiempo con Value = 700, fuera menor de 10 segundos (yo lo he contemplado en milisegundos), que es el número 262 que obtengo al final.

Lo que hago es mirar cada Value = 700 y restar el DateTime de éste con el del registro inmediatamente posterior. Luego veo cuántos cumplen ser menores de 10000 ms, numero cada registro y miro el número de filas. En realidad lo de numerar cada fila no vale para nada, salvo para que se vea más claro.

Ahora el problema que tengo es en Report Builder, donde tengo que coger ese valor que indica el número de registros que cumplen la condición y ponerlo en una tabla. La query no da error, pero no me pone el dato en la tabla.

¿Alguna idea?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
DECLARE @numeroRegistros float
;With TablaTemporal
AS
(SELECT DateTime,
Value,
TpoByPass =
CASE Value
WHEN '700' THEN
DATEDIFF (MS, DateTime, Lead(DateTime,1) OVER (ORDER BY DateTime, DateTime))
ELSE
NULL
END
FROM [Runtime].[dbo].[v_History]
  where DateTime > '2018/02/02 05:00:00'
  and DateTime <  '2018/02/07 12:00:00' --GETDATE()
  and TagName = 'UBB_Pret_Status.i.i.CB144'
  )
 
SELECT *,
ROW_NUMBER() OVER(ORDER BY DateTime) AS NumeroFila
FROM TablaTemporal
WHERE TpoByPass <10000
ORDER BY DateTime, NumeroFila
Set @numeroRegistros = @@RowCount
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

Eliminar primer registro consulta y más

Publicado por Isaias (4558 intervenciones) el 15/02/2018 17:50:24
Si ejecuto tu codigo en mi base de prueba, no me envia registro alguno


captura
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

Eliminar primer registro consulta y más

Publicado por Javier (12 intervenciones) el 15/02/2018 18:00:22
Hola Isaías,

Lo de CTE también lo vi buscando por ahí. Si un día tengo tiempo lo probaré a ver si puedo hacerlo con eso.

Ya casi lo tengo. Ahora falta sacar los datos en tablas con Report Builder.
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

Eliminar primer registro consulta y más

Publicado por Isaias (4558 intervenciones) el 15/02/2018 18:55:40
Esto que haces en un CTE

1
2
;With TablaTemporal
AS
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

Eliminar primer registro consulta y más

Publicado por Javier (12 intervenciones) el 16/02/2018 08:25:17
OK, muchas 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