Question : Compter les valeurs consécutives dans le serveur 2005 de la milliseconde SQL

J'ai besoin d'une question qui est optimisée qui renverra le dernier nombre de valeurs consécutives d'A, de B ou de C par personid.

par exemple, les champs ont lieu : le

PersonID, le mydate, A, B, C

A, B, C sera NULLE ou 1.  En outre, seulement un de ces derniers peut avoir 1 à la fois (les autres valeurs seront NULLES pour chaque rangée).  Le mydate n'est pas nécessairement commandé mais nous avons besoin des plus défuntes données consécutives de count.

Sample :

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

Would : le

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

The ConsecType n'a pas besoin nécessairement d'être le nom du champ… peut-être qu'il pourrait employer un rapport de cas ou quelque chose plus efficace pour identifier l'existence de cela value.

I pensent que MS-SQL 2005 vient avec certaines plus nouvelles configurations comme ROW_NUMBER, CTE, CLOISON, etc. qui peuvent pouvoir résoudre ceci plus facile.  Je n'en ai vu beaucoup d'exemples dehors là mais aucun qui sont facilement transmissibles (au moins à moi !).  Ils semblent également traiter des valeurs consécutives de deux types (habituellement 0 ou 1)… tandis que ceci a 3… ou potentiellement plus.  Il serait grand de fournir une solution dans laquelle il pourrait y avoir des types de N qui sont de valeur binaire (1 ou NULLE). le

The plus efficace la question est pour de grands ensembles de données, le meilleur !

Thanks !
class= de

Réponse : Compter les valeurs consécutives dans le serveur 2005 de la milliseconde SQL

b désolé ne devrait pas avoir pour saisir le groupe par…

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 :
; avec la base comme (
choisir a.*, row_number () au-dessus de (cloison par ordre (de personid) par le desc de mydate) comme rn
, cas quand a.a n'est pas nul puis « A »
                     quand a.b n'est pas nul puis « B »
                      autrement extrémité de « C » comme type
de mytable comme a
)
choisir a.personid, a.type
      , cas a.type quand « A » 
            puis cas quand b.minb  < b="">
           
Autres solutions  
  •  MS Excel 2007 et pdf - l'exportation vers le pdf prend de longues heures !
  •  Dans le Perl, comment j'ajoute une valeur à la liste, puis le contrôle pour voir si la valeur existent avant d'ajouter une nouvelle valeur
  •  Comment fais j'initialiser de la HP BL460c G6 de san et de la HP XP 240000
  •  Comment fais j'employer une clef de permis de volume sur un ordinateur de HP avec du CD de restauration
  •  Emplacement primaire de deux SCCM dans l'annuaire actif
  •  L'initiateur et la HP D2D de l'iSCSI R2 du serveur 2008 de Windows GERCENT l'issue
  •  Stocker le dossier dans le mysql using connector.net et le champ de goutte
  •  Carte vidéo d'USB - bit 32 sur le matériel travaillant au niveau du bit 64 ?
  •  asp.net que j'essaye de convertir une forme de HTML en forme d'aspx ou ? ce qui jamais. Aide du besoin sur la façon dont à à elle.
  •  Winzip 12 issues de secours du travail ?
  •  
    programming4us programming4us