1

J'utilise la version Advantage Database Server: 10.10.0.49. J'essaie de créer un numéro de ligne qui se réinitialise lors du changement d'identifiant.ADS réinitialisation numéro de ligne sur le changement de la variable d'ID retourne faux

J'ai testé un code similaire sur MySQL et cela fonctionne. Avec l'avantage, les variables renvoient 'faux' plutôt que les valeurs attendues. J'ai créé ce code de test dans ADS Architect.

drop table test; 

create table test (id varchar(5),descrip varchar(10)); 

insert into test (id,descrip) values ('1','abc'); 
insert into test (id,descrip) values ('1','xyz'); 
insert into test (id,descrip) values ('1','hij'); 
insert into test (id,descrip) values ('2','abc'); 
insert into test (id,descrip) values ('2','hij'); 

set @ids = ''; 
set @row_num = 0; 

select 
@row_num = case when @ids = id then @row_num + 1 else 1 end AS row_num 
,@ids = id as ids 
,id 
,descrip 
from 
test 
order by 
id 

... qui retourne

Item | row_num | ids |id |descrip 
-----|---------|------|---|-------- 
1 |FALSE |FALSE |1 |abc 
2 |FALSE |FALSE |1 |xyz 
3 |FALSE |FALSE |1 |hij 
4 |FALSE |FALSE |2 |abc 
5 |FALSE |FALSE |2 |hij 

... et je me attendais

Item | row_num | ids |id |descrip 
-----|---------|------|---|-------- 
1 |1  |1  |1 |abc 
2 |2  |1  |1 |xyz 
3 |3  |1  |1 |hij 
4 |1  |2  |2 |abc 
5 |2  |2  |2 |hij 

Over .. Partition By est pas pris en charge par l'ADS pour autant que je peux voir.

Répondre

0

L'affectation de valeurs à des variables dans une instruction SELECT ne fonctionne pas dans ADS.

Vous obtenez un résultat BOOL car le signe = est interprété comme l'opérateur de comparaison à la place.

Pour autant que je sais que vous devez mettre en œuvre la fonction de fenêtre vous à l'aide d'un curseur (qui pourrait ne pas être la meilleure solution du côté de la performance, mais il fonctionne):

DECLARE @id VARCHAR(5); 
DECLARE @rn INTEGER; 
DECLARE @c CURSOR AS SELECT item, id FROM #test2 ORDER BY id, descrip; 

TRY DROP TABLE #test; CATCH ALL END TRY; 

CREATE TABLE #test (item INTEGER, id VARCHAR(5), descrip VARCHAR(10)); 

INSERT INTO #test (item, id, descrip) VALUES (1, '1', 'abc'); 
INSERT INTO #test (item, id, descrip) VALUES (2, '1', 'xyz'); 
INSERT INTO #test (item, id, descrip) VALUES (3, '1', 'hij'); 
INSERT INTO #test (item, id, descrip) VALUES (4, '2', 'abc'); 
INSERT INTO #test (item, id, descrip) VALUES (5, '2', 'hij'); 

TRY DROP TABLE #test2; CATCH ALL END TRY; 

SELECT 
    tab.* 
    , 0  AS "rn" 
INTO #test2 
FROM #test tab; 

@id = ''; 
OPEN @c; 
WHILE FETCH @c DO 
    IF @id <> @c.id THEN 
    @id = @c.id; 
    @rn = 1; 
    ELSE 
    @rn = @rn + 1; 
    END IF; 

    UPDATE #test2 SET rn = @rn WHERE item = @c.item; 

END WHILE ; 
CLOSE @c; 

SELECT * FROM #test2 ORDER BY id, rn; 

Note: J'ai commandé les articles par id, descrip, au lieu de seulement id comme dans votre question. Vous devriez choisir une commande adéquate pour votre situation.

+0

Merci Jens, ça marche. J'ai juste besoin de le mapper à mes données réelles maintenant - cela pourrait être difficile car c'est une méthode peu familière pour moi, mais vous avez été d'une grande aide. –