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

SQL server

Estas en el tema de SQL server en el foro de SQL Server en Foros del Web. Buenas noches.. Tengo la siguiente consulta: Ejemplo: Hora Minuto 12 1 12 2 12 3 12 4 12 5 12 6 12 17 12 18 ...
  #1 (permalink)  
Antiguo 11/10/2012, 17:25
 
Fecha de Ingreso: octubre-2012
Mensajes: 1
Antigüedad: 11 años, 6 meses
Puntos: 0
SQL server

Buenas noches..


Tengo la siguiente consulta:

Ejemplo:

Hora Minuto
12 1
12 2
12 3
12 4
12 5
12 6
12 17
12 18
12 19
12 20
12 21
12 22
12 33
12 34
12 37
13 20
13 21
13 22
13 23
13 24
13 25


Lo que necesito saber que me muestre cuales son las horas que estan en forma consecutiva y sean mayores a 6 min. Para el ejemplo me debe mostrar las siguientes resultados.

Hora Minuto
12 1
12 2
12 3
12 4
12 5
12 6
12 17
12 18
12 19
12 20
12 21
12 22
13 20
13 21
13 22
13 23
13 24
13 25

agradezco su ayuda y colaboracion
  #2 (permalink)  
Antiguo 12/10/2012, 07:50
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: SQL server

Hola ney841026:

Veo que es tu primer mensaje en el foro, así es que te hago algunas recomendaciones para el futuro:

Primero, siempre debes incluir algo de lo que haz intentado hacer (pues suponemos que al menos intentaste hacer algo), a partir de lo que intentaste hacer debes comentarnos si la consulta te está generando un error, y si es el caso incluir el código error, o si la consulta no te está arrojando los resultados esperados, así podremos indicarte alguna otra alternativa.

Segundo, es recomendable que incluyas en tu post la versión - edición del motor de BD que estás utilizando, ya que hay algunas diferencias entre cada una de ellas y es posible que la solución que te podamos dar no aplique para la BD que utilizas.

Tercero, San GOOGLE y otros Santos Buscadores tienen respuesta para casi todas las preguntas que puedas formular... es recomendable que antes de postear algo, busques información acerca de lo necesitas, es posible que encuentres algún problema similar ya solucionado.

Ahora si, pasando a tu problema... la parte de obtener los consecutivos no es tan problematica, hay que recordar que matemáticamente el consecutivo de un numero n es n + 1, por lo tanto, podrías hacer algo como esto para obtener las tuplas consecutivas:

Código SQL:
Ver original
  1. SELECT * FROM tabla T1
  2. WHERE
  3. EXISTS (
  4.   SELECT hora, minuto
  5.   FROM tabla T2
  6.   WHERE T1.hora = T2.hora AND (T1.minuto + 1 = T2.Minuto OR
  7.                                T1.Minuto = T2.Minuto + 1)
  8. );
  9. +------+--------+
  10. | Hora | Minuto |
  11. +------+--------+
  12. |   12 |      1 |
  13. |   12 |      2 |
  14. |   12 |      3 |
  15. |   12 |      4 |
  16. |   12 |      5 |
  17. |   12 |      6 |
  18. |   12 |     17 |
  19. |   12 |     18 |
  20. |   12 |     19 |
  21. |   12 |     20 |
  22. |   12 |     21 |
  23. |   12 |     22 |
  24. |   12 |     33 |
  25. |   12 |     34 |
  26. |   13 |     20 |
  27. |   13 |     21 |
  28. |   13 |     22 |
  29. |   13 |     23 |
  30. |   13 |     24 |
  31. |   13 |     25 |
  32. +------+--------+

Para el detalle de que los minutos deben ser mayores a 6 minutos, no me quedó claro a qué te refieres con esto... supongo que sería a que entre el inicio de la secuencia y el fin haya una diferencia de 6 minutos o mas, de tal manera que para los registros 33 y 34 no se cumple... con solo estos datos es muy complicada hacerla con una consulta sencilla, podrías decirnos si tienes información adicional en tu tabla que nos pudiera ayudar para diferenciar los registros, En su defecto podrías hacerlo mediante el lenguaje de programación que estés utilizando, o mediante un SP.

Saludos
Leo.
  #3 (permalink)  
Antiguo 12/10/2012, 08:22
 
Fecha de Ingreso: julio-2012
Ubicación: Israel
Mensajes: 360
Antigüedad: 11 años, 9 meses
Puntos: 40
Respuesta: SQL server

Yo lo haría así-
primero que nada crear la tabla con los detalles:

Código SQL:
Ver original
  1. CREATE TABLE #T (Hora INT, Minuto INT);
  2.  
  3. INSERT INTO #T SELECT 12, 1;
  4. INSERT INTO #T SELECT 12, 2;
  5. INSERT INTO #T SELECT 12, 3;
  6. INSERT INTO #T SELECT 12, 4;
  7. INSERT INTO #T SELECT 12, 5;
  8. INSERT INTO #T SELECT 12, 6;
  9. INSERT INTO #T SELECT 12, 17;
  10. INSERT INTO #T SELECT 12, 18;
  11. INSERT INTO #T SELECT 12, 19;
  12. INSERT INTO #T SELECT 12, 20;
  13. INSERT INTO #T SELECT 12, 21;
  14. INSERT INTO #T SELECT 12, 22;
  15. INSERT INTO #T SELECT 12, 33;
  16. INSERT INTO #T SELECT 12, 34;
  17. INSERT INTO #T SELECT 12, 37;
  18. INSERT INTO #T SELECT 13, 20;
  19. INSERT INTO #T SELECT 13, 21;
  20. INSERT INTO #T SELECT 13, 22;
  21. INSERT INTO #T SELECT 13, 23;
  22. INSERT INTO #T SELECT 13, 24;
  23. INSERT INTO #T SELECT 13, 25;

Recuperar los datos en minutos (de lo contrario no podriamos "ver" que después de 12,59 llega 13,00):
Código SQL:
Ver original
  1. SELECT  60*Hora+Minuto AS Minutos,
  2.         *
  3. FROM    #T;

Con el CTE T1 calculamos la resta entre los minutos y el número de la fila (fijate que cada "grupo" tiene la misma resta):
Código SQL:
Ver original
  1. WITH T1 AS
  2. (SELECT 60*Hora+Minuto AS Minutos,
  3.         *
  4. FROM    #T)
  5. SELECT  Minutos-ROW_NUMBER() OVER(ORDER BY Minutos) Nm,
  6.         *
  7. FROM    T1;

Con el CTE T2 calculamos el número de filas en cada "grupo":
Código SQL:
Ver original
  1. WITH T1 AS
  2. (SELECT 60*Hora+Minuto AS Minutos,
  3.         *
  4. FROM    #T),
  5. T2 AS
  6. (SELECT Minutos-ROW_NUMBER() OVER(ORDER BY Minutos) Nm,
  7.         *
  8. FROM    T1)
  9. SELECT  COUNT(*) OVER(Partition BY Nm) Cnt,
  10.         *
  11. FROM    T2;

Con el CTE T3 filtramos las filas así que queden solamente los "grupos" con 6 filas o mas:
Código SQL:
Ver original
  1. WITH T1 AS
  2. (SELECT 60*Hora+Minuto AS Minutos,
  3.         *
  4. FROM    #T),
  5. T2 AS
  6. (SELECT Minutos-ROW_NUMBER() OVER(ORDER BY Minutos) Nm,
  7.         *
  8. FROM    T1),
  9. T3 AS
  10. (SELECT COUNT(*) OVER(Partition BY Nm) Cnt,
  11.         *
  12. FROM    T2)
  13. SELECT  *
  14. FROM    T3
  15. WHERE   Cnt>=6;

Espero que te sirva de ayuda.
__________________
El Castellano no es mi lengua materna: discúlpenme por los errores gramaticales.
Mi blog

Etiquetas: server, sql
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:35.