Pergunta : Contar valores consecutivos no usuário 2005 do MS SQL

Eu preciso uma pergunta que seja aperfeiçoada que retornará o número o mais atrasado de valores consecutivos de A, de B ou de C por personid.

por exemplo, os campos se realize: o

PersonID, mydate, A, B, C

A, B, C será ZERO ou 1.  Também, somente um destes pode ter 1 de cada vez (os outros valores serão NULOS para cada fileira).  O mydate não é requisitado necessariamente mas nós precisamos os dados consecutivos os mais atrasados de count.

Sample:

PersonID, mydate, A, B, C
================
1, 2010-04-22, 1, ZERO, NULL
1, 2010-04-18, 1, ZERO, NULL
1, 2010-04-21, 1, ZERO, NULL
2, 2010-04-18, ZERO, 1, NULL
1, 2010-04-14, 1, ZERO, NULL
1, 2010-04-15, ZERO, 1, NULL
2, 2010-04-15, 1, ZERO, retorno de NULL

Would: o

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

The ConsecType não precisa necessariamente de ser o nome do campo… talvez que poderia usar uma indicação de caso ou algo mais eficiente identificar a existência daquele value.

I pensa que MS-SQL 2005 vem com algumas caraterísticas mais novas como ROW_NUMBER, CTE, DIVISÓRIA, etc. que podem poder resolver isto mais fácil.  Eu não vi muitos exemplos para fora lá mas nenhuns que são facilmente transferíveis (pelo menos a mim!).  Igualmente parecem tratar os valores consecutivos de dois tipos (geralmente 0 ou 1)… visto que este tem 3… ou potencial mais.  Seria grande vir acima com uma solução em que poderia haver os tipos de N que são do valor binário (1 ou ZERO). o

The mais eficiente a pergunta é para grandes séries de dados, o melhor!

Thanks!
class= do

Resposta : Contar valores consecutivos no usuário 2005 do MS SQL

b pesaroso não deve ter datilografar dentro o 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:
; com base como (
selecionar a.*, row_number () sobre (divisória pela ordem (do personid) pelo desc do mydate) como o rn
, caso quando a.a não for então “A nulo”
                     quando a.b não for então “B nulo”
                      mais extremidade de “C” como o tipo
de mytable como a
)
selecionar a.personid, a.type
      , caso a.type quando “A” 
            então caso quando b.minb  < b="">
           
Outras soluções  
 
programming4us programming4us