Questione : Contare i valori successivi in assistente 2005 del ms SQL

Ho bisogno di una domanda che è ottimizzata che restituirà l'ultimo numero dei valori successivi di A, della B o della C da personid.

per esempio, i campi ha luogo: il

PersonID, mydate, A, B, C

A, B, C sarà POSIZIONE DI SEGNALE MINIMO o 1.  Inoltre, soltanto uno di questi può avere 1 alla volta (gli altri valori saranno NULLI per ogni fila).  Il mydate necessariamente non è ordinato ma abbiamo bisogno di ultimi dati successivi di count.

Sample:

PersonID, mydate, A, B, C
================
1, 2010-04-22, 1, POSIZIONE DI SEGNALE MINIMO, NULL
1, 2010-04-18, 1, POSIZIONE DI SEGNALE MINIMO, NULL
1, 2010-04-21, 1, POSIZIONE DI SEGNALE MINIMO, NULL
2, 2010-04-18, POSIZIONE DI SEGNALE MINIMO, 1, NULL
1, 2010-04-14, 1, POSIZIONE DI SEGNALE MINIMO, NULL
1, 2010-04-15, POSIZIONE DI SEGNALE MINIMO, 1, NULL
2, 2010-04-15, 1, POSIZIONE DI SEGNALE MINIMO, ritorno di NULL

Would: il

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

The ConsecType necessariamente non deve essere il nome del campo… forse potrebbe usare una dichiarazione di caso o qualcosa più efficiente identificare l'esistenza di quello value.

I pensa che MS-SQL 2005 venga con alcune più nuove caratteristiche come ROW_NUMBER, CTE, il DIVISORIO, ecc. che possono potere risolvere questo più facile.  Non ne ho veduto molti esempi fuori là ma che fossero facilmente trasferibili (almeno a me!).  Inoltre sembrano occuparsi dei valori successivi di due tipi (solitamente 0 o 1)… mentre questo ha 3… o potenzialmente più.  Sarebbe grande da fornire una soluzione in cui ci potrebbero essere tipi di N che sono utile binario (1 o POSIZIONE DI SEGNALE MINIMO). il

The più efficiente la domanda è per i grandi gruppi di dati, il migliore!

Thanks!
class= del

Risposta : Contare i valori successivi in assistente 2005 del ms SQL

la b spiacente non dovrebbe avere scriv dentro il gruppo a macchina da…

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 come (
selezionare a.*, row_number () sopra (divisorio da ordine (del personid) dal desc del mydate) come Marina militare
, caso quando a.a non è nullo allora “A„
                     quando a.b non è nulla allora “B„
                      altrimenti estremità “di C„ come tipo
da mytable come a
)
selezionare a.personid, a.type
      , caso a.type quando “A„ 
            allora caso quando b.minb  < b="">
           
Altre soluzioni  
 
programming4us programming4us