1

私はバージョンAdvantage Database Serverを使用しています:10.10.0.49。ID変数の変更時にADSが行番号をリセットすると、falseが返されます

idの変更時にリセットされる行番号を作成しようとしています。

私はMySQLで同様のコードをテストしています。

Advantageでは、変数は両方とも期待値ではなく「false」を返します。

私はこのテストコードをADS Architectに作成しました。

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 

を返し

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 

... ...と私は

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は、私の知る限りADSでサポートされていません。

答えて

0

SELECTステートメント内の変数に値を割り当てることは、ADSでは機能しません。

=符号が比較演算子として代わりに解釈されるため、結果はBOOLになります。

限り、私はあなたが(パフォーマンスの面で最高の解決策になるが、それは動作しますしない場合があります)カーソルを使用して窓関数を自分で実装する必要が知っているように:

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; 

注:私が注文しましたあなたの質問にちょうどidの代わりにid, descripの項目。あなたは、あなたの状況に適した順序を選択する必要があります。

+0

ありがとう、ジェンスズ、それは動作します。私はそれを私の本当のデータに今マップする必要があります - それは私にとっては馴染みのない方法だから面倒なこともありますが、あなたは大きな助けになりました。 –

関連する問題