Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Seleccionar los dos primeros registros de cada día

Estas en el tema de Seleccionar los dos primeros registros de cada día en el foro de SQL Server en Foros del Web. Buenas a todos tengo una tabla donde se van insertando en una columna un campo smalldatetime y en otro un decimal, para que os hagais ...
  #1 (permalink)  
Antiguo 13/02/2009, 03:41
 
Fecha de Ingreso: febrero-2006
Mensajes: 38
Antigüedad: 18 años, 2 meses
Puntos: 0
Pregunta Seleccionar los dos primeros registros de cada día

Buenas a todos tengo una tabla donde se van insertando en una columna un campo smalldatetime y en otro un decimal, para que os hagais una idea unos pocos registros:
FECHA RES
01/02/2009 12:55 -1.00
01/02/2009 13:20 1.00
01/02/2009 13:20 1.00
03/02/2009 13:10 1.00
03/02/2009 13:10 1.00
03/02/2009 13:40 1.00
04/02/2009 13:15 1.00
04/02/2009 13:30 1.00
04/02/2009 13:45 1.00
04/02/2009 14:00 1.00

Lo que necesito es seleccionar los dos primeros registros de cada día, se me había ocurrido
SELECT TOP(2) FECHA, RES FROM RESULTADO WHERE RESULTADO.FECHA=(SELECT DISTINT FECHA FROM RESULTADO)

Pero como el cambo fecha contiene la hora no me selecciona las fechas:
01/02/2009
03/02/2009
04/02/2009 ...

Bueno indagando con la siguiente sentencia consigo sacar las fechas que no se repiten
SELECT DISTINCT CONVERT(varchar,FECHA,101) AS F FROM RESULTADO

Lo que todavía no se como hacer es seleccionar los dos primeros registros de cada día


Se os ocurre algo?
Gracias

Última edición por elwilly; 13/02/2009 a las 05:41
  #2 (permalink)  
Antiguo 13/02/2009, 09:12
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: Seleccionar los dos primeros registros de cada día

Código SQL:
Ver original
  1. SELECT MIN(FECHA_RES)
  2. FROM tabla1
  3. GROUP BY CONVERT(CHAR(10),FECHA_RES,103)
  4. UNION
  5. SELECT MIN(T1.FECHA_RES)
  6. FROM tabla1 T1
  7. INNER JOIN (
  8.     SELECT CONVERT(CHAR(10),FECHA_RES,103)[FECHA],MIN(CONVERT(CHAR(8),FECHA_RES,108))[HORA]
  9.     FROM tabla1
  10.     GROUP BY CONVERT(CHAR(10),FECHA_RES,103)
  11. ) T2 ON CONVERT(CHAR(10),T1.FECHA_RES,103)=T2.FECHA AND CONVERT(CHAR(8),T1.FECHA_RES,108)<>T2.HORA
  12. GROUP BY CONVERT(CHAR(10),T1.FECHA_RES,103)
Hay problema con 03/02/2009, pero eso ya te lo dejo de tarea.
Suerte!
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #3 (permalink)  
Antiguo 13/02/2009, 13:12
 
Fecha de Ingreso: febrero-2006
Mensajes: 38
Antigüedad: 18 años, 2 meses
Puntos: 0
Respuesta: Seleccionar los dos primeros registros de cada día

Muchas gracias Flaviovich.
Ahora voy a intentar entender como lo has realizado

Flaviovich pero no aparece el campo RES y si lo incluyo en el SELECT me trae todos los registros!
Las columnas que tengo que seleccionar son 2. Una es FECHA que contiene el SMALLDATETIME y la otra es RES que contiene el DECIMAL. Al incluir la columna RES en el SELECT y el GROUP BY me trae todos los registros.

Por otro lado sería muy dificil que en lugar de los 2 primeros pudiese mostrar los 3 o 4 o x primeros?
Voy a intentarlo y si no lo pillo os pregunto.

Muchisimas gracias!! :)

Última edición por elwilly; 13/02/2009 a las 14:22
  #4 (permalink)  
Antiguo 13/02/2009, 14:34
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 18 años, 8 meses
Puntos: 39
Respuesta: Seleccionar los dos primeros registros de cada día

Código sql:
Ver original
  1. SELECT CONVERT(CHAR(10),FECHA,103),MIN(RES)
  2. FROM tabla1
  3. GROUP BY CONVERT(CHAR(10),FECHA,103)
  4. UNION ALL
  5. SELECT CONVERT(CHAR(10),T1.FECHA,103),MIN(T1.RES)
  6. FROM tabla1 T1
  7. INNER JOIN (
  8.     SELECT CONVERT(CHAR(10),FECHA,103)[FECHA],MIN(CONVERT(CHAR(10),FECHA,108))[HORA]
  9.     FROM tabla1
  10.     GROUP BY CONVERT(CHAR(10),FECHA,103)
  11. ) T2 ON CONVERT(CHAR(10),T1.FECHA,103)=T2.FECHA AND CONVERT(CHAR(10),T1.FECHA,108)<>T2.HORA
  12. GROUP BY CONVERT(CHAR(10),T1.FECHA,103)
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #5 (permalink)  
Antiguo 13/02/2009, 15:00
 
Fecha de Ingreso: febrero-2006
Mensajes: 38
Antigüedad: 18 años, 2 meses
Puntos: 0
Respuesta: Seleccionar los dos primeros registros de cada día

Gracias Flaviovich pero con esa consulta me esta devolviendo el valor minino de RES y no es correcto pues he de seleccionar el valor RES asociado a esa FECHA.
Yo he hecho lo siguiente:
He creado una vista llamada VISTA_tabla con la primera sentencia que publicastes y a continuación he creado la siguiente consulta:
SELECT F,
(SELECT TOP(1) CUOTA FROM tabla1
WHERE tabla1.FECHA=DBO.VISTA_tabla.F)AS CUOT
FROM VISTA_tabla

De esta manera si me devuleve el valor que le corresponde a RES con cada fecha pero ahora me enfrente al problema que mencionabas con el dia 03/02/2009. Como los dos primeros registros son 03/02/2009 13:10, es decir tienen el mismo valor pasa al siguiente registro y para ese día coge los valores de los registros con FECHA:
03/02/2009 13:10
03/02/2009 13:40

Vamos a ver si lo consigo. De nuevo muchisimas gracias!!

Pues nada que no doy con la solución para que no salte de fecha cuando coinciden a no ser que inlcuya algún campo más de filtrado pero no se como hacerlo.

Por otro lado se podría poner una columna al lado que fuese incluyendo la suma del resultado de los registros anteriores?

Como siempre muchas gracias por vuestra ayuda!!

Última edición por elwilly; 14/02/2009 a las 05:13
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:06.