2016-09-22 1 views
1

J'ai une table qui ressemble à ceci:Compte combien de lignes sont pour une valeur dans SQL?

[ContractId]  [ContractDate] [SnapshotTimeId] [DaysPastDue] [Exposure] 

Int(not unique) Datetime  Int(format20160431) Int   Int 

Le tableau est trié par ContractId, ContractDate.

Maintenant, je voudrais ajouter une 6ème colonne, appelons-la Unique, qui a la valeur 1 pour la première valeur ContractId puis ajoute 1 jusqu'à ce qu'elle rencontre le ContractId suivant. Fondamentalement, je veux savoir combien de lignes j'ai pour chaque ContractId et mettre les valeurs, de manière incrémentale, dans une colonne.

Edit: Je veux que la sortie ressemble à ce

>DocumentId ContractDate SnapshottimeId DPD Exposure Unique 
>1   31-Aug-15  31-Aug-15  0 500  1 
>1   31-Aug-15  30-Sep-15  5 450  2 
>1   31-Aug-15  31-Oct-15  35 450  3 
>1   31-Aug-15  30-Nov-15  7 350  4 
>1   31-Aug-15  31-Dec-15  37 350  5 
>1   31-Aug-15  31-Jan-16  67 340  6 
>2   31-Aug-15  30-Jun-14  3 800  1 
>2   31-Aug-15  31-Jul-14  15 760  2 
>2   31-Aug-15  31-Aug-14  45 750  3 
>2   31-Aug-15  30-Sep-14  75 750  4 
>2   31-Aug-15  31-Oct-14  0 630  5 
>2   31-Aug-15  30-Nov-14  15 590  6 
>2   31-Aug-15  31-Dec-14  45 580  7 
+2

Pouvez-vous montrer quelques exemples d'entrée et exp ect output – TheGameiswar

+0

Fournir des exemples de données – Wanderer

+0

Lorsque vous dites "ajouter une 6ème colonne", voulez-vous dire le stocker physiquement dans la base de données, ou créer cette valeur lorsque vous "sélectionnez" des données? – Jamiec

Répondre

3

Je pense que vous voulez row_number():

select t.*, 
     row_number() over (partition by contractid order by contractdate) as seqnum 
from t; 

Cela mettra une valeur incrémentielle, ce qui est ce que je pense que vous décrivez.

Si vous voulez juste le nombre de lignes pour chaque contrat dans chaque ligne, puis utilisez:

select t.*, 
     count(*) over (partition by contractid) as cnt 
from t; 

Cela mettrait « 6 » dans chaque ligne, s'il y a six lignes pour un contrat.

+0

Merci! row_number est ce que je cherchais! –

2

qui a une valeur 1 pour la première valeur de ContractId ajoute ensuite 1 jusqu'à ce qu'elle bute sur la prochaine ContractId

RowNumber fera l'affaire

select *, 
Row_number() over (partition by contractid order by contractid) as countt 
from 
table 
0

Si vous voulez connaître la ligne nombre dans votre tableau, il suffit d'utiliser ceci:

Select ContractId, 
    ContractDate, 
    SnapshotTimeId, 
    DaysPastDue, 
    Exposure, 
    row = ROW_NUMBER() OVER(ORDER BY [ContractId] asc) AS Row 
From YourTable