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

Obtener MAX agrupando por horas

Estas en el tema de Obtener MAX agrupando por horas en el foro de SQL Server en Foros del Web. Hola, Estoy intentando hacer una consulta que obtenga de una tabla el máximo valor para cada cuarto de hora entre varios días y que además ...
  #1 (permalink)  
Antiguo 09/01/2012, 11:48
 
Fecha de Ingreso: septiembre-2005
Mensajes: 26
Antigüedad: 19 años, 2 meses
Puntos: 0
Pregunta Obtener MAX agrupando por horas

Hola,

Estoy intentando hacer una consulta que obtenga de una tabla el máximo valor para cada cuarto de hora entre varios días y que además me diga para cada resultado la fecha que tenía ese máximo.

La tabla tiene 2 campos:
1- Fecha(DateTime)
2- Valor (Float)

Ejemplo:

1/1/2012 00:00 59
1/1/2012 00:15 64
1/1/2012 00:30 67
1/1/2012 00:45 23
1/1/2012 01:00 54
1/1/2012 01:15 78
...
2/1/2012 00:00 12
2/1/2012 00:15 58
2/1/2012 00:30 45
2/1/2012 00:45 79
...

Yo puedo obtener entre dos fechas que máximo y mínimo tengo en cada cuarto de hora:

Select Convert(Char(8), Fecha, 108) as Hora, MIN([Valor]) as ValorMin, MAX([Valor]) as ValorMax
From Datos
Where Fecha Between @FechaInicio and @FechaFin
Group by Convert(Char(8), Fecha, 108)


¿Como puedo obtener la fecha en el resultado?
Si la pongo en la consulta me obliga a agrupar también por fecha y ya no hace lo que necesito.

Gracias!
  #2 (permalink)  
Antiguo 09/01/2012, 13:35
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 11 meses
Puntos: 38
Respuesta: Obtener MAX agrupando por horas

No se podrian mostrar todas las fechas ya que tu resultado es agrupado.

Lo que puedes hacer es ponerle un min o max...es decir, una funcion de agrupacion..


Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #3 (permalink)  
Antiguo 10/01/2012, 06:43
 
Fecha de Ingreso: septiembre-2005
Mensajes: 26
Antigüedad: 19 años, 2 meses
Puntos: 0
Respuesta: Obtener MAX agrupando por horas

Gracias por la ayuda.

Si le pongo un max a la fecha no me saca la fecha que se corresponde con el valor máximo de cada cuarto de hora, saca la fecha máxima entre el rango que le ponga.

¿Más sugerencias?
  #4 (permalink)  
Antiguo 13/01/2012, 05:33
 
Fecha de Ingreso: octubre-2009
Mensajes: 29
Antigüedad: 15 años
Puntos: 4
Respuesta: Obtener MAX agrupando por horas

Pues se me ocurre algo así:

Código SQL:
Ver original
  1. SELECT CONVERT(CHAR(8), fecha, 108) AS cuartoHora,
  2.        MAX(CAST(valor AS CHAR)+'_'+CONVERT(CHAR)CONVERT(VARCHAR(),fecha,111)) AS codificacion
  3. FROM tabla
  4. GROUP BY CONVERT(CHAR(8), fecha, 108)

de esa manera obtienes todos los cuartos de hora posibles y te quedas con el que tenga el valor máximo. Como tienes concatenada la fecha, solo tienes que "descodificar" y ya tienes lo que quieres.

Como fallos a la query que te he puesto, al hacer el cast del valor, tendrías que rellenar con ceros a la izquierda ya que sino el max te cogería un 2 como mayor que in 10 (si pones 02 no pasaría eso).

No se si me he explicado demasiado, pero, en cuanto tenga tiempo, completo la query y la pongo con comentarios. Cualquier duda me comentas.

Un saludo

Última edición por ellgon; 13/01/2012 a las 05:34 Razón: La query estaba mal
  #5 (permalink)  
Antiguo 13/01/2012, 06:19
 
Fecha de Ingreso: octubre-2009
Mensajes: 29
Antigüedad: 15 años
Puntos: 4
Respuesta: Obtener MAX agrupando por horas

Pues ya he vuelto con la query terminada.

La query que te da lo que quieres es:

Código SQL:
Ver original
  1. SELECT
  2.   cuartoHora,
  3.   CAST(SUBSTRING(codificacion, 1,4) AS INT) AS valor,
  4.   CONVERT(datetime, SUBSTRING(codificacion, 6, len(codificiacion)), 111) AS fecha
  5. FROM
  6.   (
  7.     SELECT
  8.       CONVERT(CHAR(8), Fecha, 108) AS cuartoHora,
  9.       MAX(
  10.         RIGHT('0000' + CAST(valor AS CHAR(4)), 4)+'_'+
  11.         CONVERT(CHAR)CONVERT(VARCHAR(),fecha,111)
  12.       ) AS codificacion
  13.     FROM tabla
  14.     GROUP BY CONVERT(CHAR(8), Fecha, 108)
  15.   ) A

Puede tener fallos, porque no la he ejecutado, pero el concepto es ese.
Si tienes cualquier duda o quieres que la explique, me dices algo.

Un saludo

Edito: esta query te permite detectar un valor máximo de 9999 (por eso se añaden 4 ceros y se cogen los cuatro caracteres de la derecha) si el valor puede ser mayor, se modifica el número de ceros, el cast(valor as char(X)) y se modifica el right.

Última edición por ellgon; 13/01/2012 a las 06:21 Razón: Añado explicación adicional.

Etiquetas: agrupar, fecha, max
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 18:23.