Fråga : Räkningen som är i rad, värderar i serveren 2005 för ms SQL

Jag behöver en query som optimeras, som ska retur som de senast numrerar av i rad värderar av endera A, B, eller C vid personid.

For example, sätter in är:

PersonID, mydate, A, B, C

A, B, C ska endera är OGILTIG eller 1.  Också endast en av dessa kan ha 1 i sänder (annat värderar ska är OGILTIGT för varje ror).  Mydaten beställas inte nödvändigtvis, men vi behöver de senaste datan i rad för count.

Sample:

PersonID, mydate, A, B, C
================
1, 2010-04-22, 1 som ÄR OGILTIG, NULL
1, 2010-04-18, 1 som ÄR OGILTIG, NULL
1, 2010-04-21, 1 som ÄR OGILTIG, NULL
2, 2010-04-18, OGILTIGT, 1, NULL
1, 2010-04-14, 1 som ÄR OGILTIG, NULL
1, 2010-04-15, OGILTIGT, 1, NULL
2, 2010-04-15, 1 som ÄR OGILTIG, NULL

Would retur:

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

The ConsecType behöver inte nödvändigtvis att vara det känt av sätta in,… kanske som den kunde använda ett fallmeddelande, eller något som är effektivare att identifiera existensen av det funderare MS-SQL 2005 för value.

I, kommer med några nyare särdrag lik ROW_NUMBER, CTE, DELNINGEN, Etc. som kan vara kompetent att lösa detta som är lättare.  Jag har sett många exempel ut där men inga som är lätt överförbara (åtminstone till mig!).  De verkar också för att handla med i rad värderar av två typer (vanligt 0 eller 1)…, eftersom denna har 3… eller potentiellt mer.  Den skulle är stor att komma upp med en lösning som det kunde finnas i n-typer, som är av binärt värderar (1 eller OGILTIGT). effektivare

The queryen är för stora datasets, det bättre!

Thanks!
" klar "

Svar : Räkningen som är i rad, värderar i serveren 2005 för ms SQL

ledset b bör inte ha typ i gruppen vid…,

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:
; med basera som (
vald a.*, row_number () över (delningen (personid) beställer by vid mydatedesc), som rn
, fall, när a.a inte är ogiltigt därefter ”A”,
                     när a.b inte är ogiltigt därefter ”B”,
                      annars ”C” avslutar som typ
från mytable som a
)
välj a.personid, a.type
      , fall a.type, när ”A”, 
            därefter fall när b.minb  < b="">
           
Andra lösningar  
 
programming4us programming4us