2010-01-14 12 views
2

Est-il possible d'ajouter une colonne d'identité à un GROUP BY afin que chaque doublon ait un numéro d'identité?Est-il possible d'ajouter une identité à un GROUP BY en utilisant SQL?

Mes données d'origine ressemble à ceci:

1 AAA [timestamp] 
2 AAA [timestamp] 
3 BBB [timestamp] 
4 CCC [timestamp] 
5 CCC [timestamp] 
6 CCC [timestamp] 
7 DDD [timestamp] 
8 DDD [timestamp] 
9 EEE [timestamp] 
.... 

Et je veux le convertir en:

1 AAA 1 
2 AAA 2 
4 CCC 1 
5 CCC 2 
6 CCC 3 
7 DDD 1 
8 DDD 2 
... 

La solution était:

CREATE PROCEDURE [dbo].[RankIt] 
AS 
BEGIN 
SET NOCOUNT ON; 

SELECT *, RANK() OVER(PARTITION BY col2 ORDER BY timestamp DESC) AS ranking 
FROM MYTABLE; 

END 

Répondre

4

Vous pouvez essayer d'utiliser ROW_NUMBER si vous utilisez Sql Server 2005

DECLARE @Table TABLE(
     ID INT, 
     Val VARCHAR(10) 
) 

INSERT INTO @Table SELECT 1,'AAA' 
INSERT INTO @Table SELECT 2,'AAA' 
INSERT INTO @Table SELECT 3,'BBB' 
INSERT INTO @Table SELECT 4,'CCC' 
INSERT INTO @Table SELECT 5,'CCC' 
INSERT INTO @Table SELECT 6,'CCC' 
INSERT INTO @Table SELECT 7,'DDD' 
INSERT INTO @Table SELECT 8,'DDD' 
INSERT INTO @Table SELECT 9,'EEE' 

SELECT *, 
     ROW_NUMBER() OVER(PARTITION BY VAL ORDER BY Val) 
FROM @Table 
+0

i essayé SELECT *, RANK() OVER (ORDER BY col2) AS rang de table et il se bloque mon studio de gestion SQL2005 ... – djangofan

+0

pas oublier d'utiliser ** PARTITION BY ** comme dans l'exemple. –

+0

SELECT *, ROW_NUMBER() OVER (PARTITION BY col2) bloque également mon studio de gestion sql. Ce classement et partition est bizarre .... je ne peux pas comprendre. – djangofan

3
create table #testalot 
(
    [id] int identity, 
    data varchar(50) 
) 

insert #testalot (data) values('AAA') 
insert #testalot (data) values('AAA') 
insert #testalot (data) values('BBB') 
insert #testalot (data) values('CCC') 
insert #testalot (data) values('CCC') 
insert #testalot (data) values('CCC') 
insert #testalot (data) values('DDD') 
insert #testalot (data) values('DDD') 

select *,ROW_NUMBER() OVER(PARTITION BY data ORDER BY data DESC) AS 'Number' 
from #testalot 

drop table #testalot 

retours

id data Number 
1 AAA 1 
2 AAA 2 
3 BBB 1 
4 CCC 1 
5 CCC 2 
6 CCC 3 
7 DDD 1 
8 DDD 2 
+0

soupir ... cliquez sur la sauvegarde et la page arrive avec quelqu'un d'autre entrant la même réponse 3 minutes plus tôt. – Hogan

+0

Je n'ai jamais pu l'utiliser avec ROW_NUMBER(). J'ai fini par utiliser RANK(). – djangofan

+1

-shrug- J'ai testé le code ci-dessus. Ils donnent réellement des résultats différents lorsque vous avez des liens. – Hogan