J'ai une table avec vdateTime, colonne de catégorie.
Je veux une colonne avec un nombre incrémental basé sur la valeur de la catégorie précédente. I.E Si la catégorie actuelle est la même que celle du compteur précédent sera incrémentation sinon elle se réinitialisera à 1.
J'utilise dense_rank () code> mais comment réinitialiser la valeur si la valeur antérieure n'est pas la même que celle actuelle?
3 Réponses :
Ceci est un problème de lacunes et de îles. Je suggérerais la différence de numéros de ligne:
Vous pouvez essayer avec une autre approche possible à l'aide des fonctions de fenêtre table: p> Déclaration: P> lag () code> et somme () code>: ;WITH ChangesCTE AS (
SELECT
vDateTime, category,
CASE WHEN LAG(Category) OVER (ORDER BY vDateTime) = Category THEN 0 ELSE 1 END AS [Change]
FROM Data
), GroupsCTE AS (
SELECT
vDateTime, category,
SUM([Change]) OVER (ORDER BY vDateTime) AS [Group]
FROM ChangesCTE
)
SELECT
vDateTime, category,
ROW_NUMBER() OVER (PARTITION BY [Group] ORDER BY vDateTime) AS rn
FROM GroupsCTE
Une option utiliserait démo kbd> p> p> p> P> Lag () code> fonction analytique une fois et Somme () sur () sur () code> fonction analytique deux fois comme
S'il vous plaît, postez des données d'exemple comme texte.
4/27/2010 16:12 KCLK 1 6/15/2010 17:40 Kcle 1 7/12/2010 10:29 KCLK 2 8/13/2010 10:41 KCLK 3 8/13/2010 11:33 Kcle 2 8/17/2010 15:37 Kcle 3 9/1/2010 11:10 Kcle 4 9/17/2010 10:37 kcle 5 21 21 21 21 9/06/2010 12:22 Kcle 6 9/27/2010 15:38 Kcle 7 9/28/2010 14:11 KXAMC 1 10/8/2010 11:18 KCLK 4 10/8/2010 15:45 Kcle 8