Vraag : De opeenvolgende waarden van de telling in de Server 2005 van lidstaten SQL

Ik heb een vraag nodig die dat het recentste aantal opeenvolgende waarden van of A, B of C door personid.

bijvoorbeeld zal terugkeren wordt geoptimaliseerd, zijn de gebieden:

PersonID, mydate, A, B, C

A, B, zal C of of 1 ONGELDIG zijn.  Ook, kan slechts één hiervan 1 in een tijd (de andere waarden zullen voor elke rij ONGELDIG zijn) hebben.  Mydate wordt niet noodzakelijk bevolen maar wij hebben de recentste opeenvolgende count.

Sample- Gegevens nodig:

PersonID, mydate, A, B, C
================
1, 2010-04-22, ONGELDIGE 1, NULL
1, 2010-04-18, ONGELDIGE 1, NULL
1, 2010-04-21, ONGELDIGE 1, NULL
2, 2010-04-18, ONGELDIG, 1, NULL
1, 2010-04-14, ONGELDIGE 1, NULL
1, 2010-04-15, ONGELDIG, 1, NULL
2, 2010-04-15, 1, ONGELDIG, de terugkeer/>Would van NULL

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

The ConsecType noodzakelijk te hoeven niet de naam van het gebied te zijn… misschien kon het een gevalverklaring gebruiken of iets efficiënter om het bestaan van dat value.

I te identificeren denkt lidstaten-SQL 2005 met sommige nieuwere eigenschappen zoals ROW_NUMBER, CTE, VERDELING, enz. komt die dit kunnen kunnen oplossen gemakkelijker.  Ik heb vele voorbeelden daar maar niets gezien die gemakkelijk overdraagbaar zijn (op zijn minst aan me!).  Zij schijnen ook om opeenvolgende waarden van twee types (gewoonlijk 0 of 1) te behandelen… terwijl dit 3… of potentieel meer heeft.  Het zou groot om met een oplossing zijn op de proppen te komen waarin er de types van N zou kunnen zijn die van binaire waarde zijn (1 of VERKLAART nietig). efficiëntere

The de vraag is voor grote datasets, beter!

Thanks!

Antwoord : De opeenvolgende waarden van de telling in de Server 2005 van lidstaten SQL

droevige B zou moeten hebben geen type in de groep door…

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:
; met basis zoals (
selecteer a.*, row_number () over (verdeling door (personid) orde door mydate desc) als RN
, geval wanneer a.a geen ongeldig toen 'a' is
                     wanneer a.b geen ongeldig toen 'b' is
                      anders het eind van „C“ als Type
van mytable als a
)
selecteer a.personid, a.type
      , geval a.type wanneer 'a' 
            dan geval wanneer b.minb  < b="">
           
Andere oplossingen  
 
programming4us programming4us