Ver Mensaje Individual
  #7 (permalink)  
Antiguo 23/12/2015, 18:20
andr35_12
 
Fecha de Ingreso: diciembre-2015
Mensajes: 5
Antigüedad: 9 años
Puntos: 0
Respuesta: Ciclos en select SQL

Cita:
Iniciado por Libras Ver Mensaje
y el campo fecha que valores tiene? si lo tienes con una fecha creo que es posible usar alguna de las funciones de sql server, otra pregunta, repites los valores de nombre, estos se repiten???

Podrias usar esto:

Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. id INT IDENTITY(1,1),
  4. valor VARCHAR(20),
  5. valor1 INT
  6. )
  7. INSERT INTO #temp VALUES ('Inicio', 111)
  8. INSERT INTO #temp VALUES ('Mover', 111)
  9. INSERT INTO #temp VALUES ('Bajar', 111)
  10. INSERT INTO #temp VALUES ('Termina', 111)
  11. INSERT INTO #temp VALUES ('Inicio', 999)
  12. INSERT INTO #temp VALUES ('mover', 999)
  13. INSERT INTO #temp VALUES ('Termina', 999)
  14. INSERT INTO #temp VALUES ('Inicio', 888)
  15. INSERT INTO #temp VALUES ('mover', 888)
  16. INSERT INTO #temp VALUES ('Inicio', 222)
  17.  
  18.  
  19. SELECT *, dense_rank() OVER(ORDER BY valor1) AS col FROM #temp ORDER BY id

Y da como resultado esto:

id valor valor1 col
1 Inicio 111 1
2 Mover 111 1
3 Bajar 111 1
4 Termina 111 1
5 Inicio 999 4
6 mover 999 4
7 Termina 999 4
8 Inicio 888 3
9 mover 888 3
10 Inicio 222 2


o puedes usar esto:

Código SQL:
Ver original
  1. SELECT t1.*,campo FROM #temp AS t1 LEFT JOIN
  2. (
  3. SELECT DENSE_RANK() OVER(ORDER BY id) AS campo,valor,valor1,id FROM #temp WHERE valor='inicio'
  4. ) AS t2 ON (t1.id=t2.id)

donde da como resultado esto:

id valor valor1 campo
1 Inicio 111 1
2 Mover 111 NULL
3 Bajar 111 NULL
4 Termina 111 NULL
5 Inicio 999 2
6 mover 999 NULL
7 Termina 999 NULL
8 Inicio 888 3
9 mover 888 NULL
10 Inicio 222 4
Hola, gracias por contestar, desconocia la función de dense_rank(), pero resulta que no tengo una columna que se repita y con la cual podría agrupar como los valores 111 y 222 que pones de ejemplo.
Lo que estoy estoy realizando es lo siguiente:

Código SQL:
Ver original
  1. SELECT nes.ProcessStart
  2.     ,nes.ProceesEnd
  3.     ,h.*
  4. FROM temp h
  5. LEFT JOIN (
  6.     SELECT nh3.id ProcessStart
  7.         ,ne2.id ProceesEnd
  8.         ,nh3.Row2 RowStart
  9.         ,ne2.ROW RowEnd
  10.  
  11.     FROM (
  12.         SELECT ROW_NUMBER() OVER(ORDER BY nh2.ROW)Row2
  13.             ,nh2.*
  14.         FROM (
  15.             SELECT ROW_NUMBER() OVER(ORDER BY nh.ID)ROW
  16.                 ,nh.*
  17.             FROM temp nh
  18.  
  19.         )nh2
  20.         WHERE nh2.valor = 'Inicio'
  21.     )nh3
  22.     LEFT JOIN (
  23.         SELECT ROW_NUMBER() OVER(ORDER BY ne.ROW) Row2
  24.         ,ne.* FROM (
  25.             SELECT ROW_NUMBER() OVER(ORDER BY nh.ID)ROW
  26.                 ,nh.*
  27.             FROM temp nh
  28.  
  29.         )ne
  30.         WHERE ne.valor = 'Inicio'
  31.     )ne2 ON (ne2.Row2) = nh3.Row2+1
  32. )nes ON nes.ProcessStart <= h.ID
  33.     AND (nes.ProceesEnd > h.ID OR nes.ProceesEnd IS NULL)
El query que estoy realizando agrupa bien siempre y cuando esten ordenados, es decir, sea de inicia, mover, bajar, terminar, pero no cuando se dos procesos inician la misma veces, así inicio, inicio, mover....