Cuestión : Contar los valores consecutivos en el servidor 2005 del ms SQL

Necesito una pregunta se optimice que que volverá el último número de valores consecutivos de A, de B o de C por personid.

por ejemplo, los campos sea: el

PersonID, mydate, A, B, C

A, B, C será FALTA DE INFORMACIÓN o 1.  También, solamente uno de éstos puede tener 1 a la vez (los otros valores serán NULOS para cada fila).  El mydate no se pide necesario pero necesitamos los últimos datos consecutivos de count.

Sample:

PersonID, mydate, A, B, C
================
1, 2010-04-22, 1, FALTA DE INFORMACIÓN, NULL
1, 2010-04-18, 1, FALTA DE INFORMACIÓN, NULL
1, 2010-04-21, 1, FALTA DE INFORMACIÓN, NULL
2, 2010-04-18, FALTA DE INFORMACIÓN, 1, NULL
1, 2010-04-14, 1, FALTA DE INFORMACIÓN, NULL
1, 2010-04-15, FALTA DE INFORMACIÓN, 1, NULL
2, 2010-04-15, 1, FALTA DE INFORMACIÓN, vuelta de NULL

Would: el

PersonID, ConsecType, ConsecCount
======================
1, A, 3
2, B, 1

The ConsecType no necesita necesario ser el nombre del campo… quizás que podría utilizar una declaración de caso o algo más eficiente identificar la existencia de eso value.

I piensa que MS-SQL 2005 viene con algunas más nuevas características como ROW_NUMBER, CTE, la PARTICIÓN, el etc. que puedan poder solucionar esto más fácil.  No he visto muchos ejemplos hacia fuera allí pero ningunos que es fácilmente tranferible (por lo menos a mí!).  También parecen ocuparse de valores consecutivos de dos tipos (generalmente 0 o 1)… mientras que esto tiene 3… o potencialmente más.  Sería grande subir con una solución en la cual podría haber los tipos de N que están de valor binario (1 o FALTA DE INFORMACIÓN). ¡el

The más eficiente la pregunta está para los grupos de datos grandes, el mejor! ¡

Thanks!
class= del

Respuesta : Contar los valores consecutivos en el servidor 2005 del ms SQL

b apesadumbrado no debe tener mecanografiar adentro al grupo por…

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
; con la base como (
seleccionar a.*, row_number () sobre (partición por orden (del personid) por el desc del mydate) como rn
, caso cuando a.a no es entonces “A nula”
                     cuando a.b no es entonces “B nulo”
                      extremo de “C” como tipo
de mytable como a
)
seleccionar a.personid, a.type
      , caso a.type cuando “A” 
            entonces caso cuando b.minb  < b="">
           
Otras soluciones  
 
programming4us programming4us