ADS 在更改 id 变量时重置行号 returns false

ADS resetting row number on change of id variable returns false

我使用的是优势数据库服务器版本:10.10.0.49。

我正在尝试创建一个在更改 ID 时重置的行号。

我已经在 MySQL 上测试了类似的代码并且它有效。

使用 Advantage 变量 return 'false' 而不是预期值。

我已经在 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

...其中 returns

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

...我期待

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 .. 据我所知,ADS 不支持 Partition By

在 SELECT 语句中为变量赋值在 ADS 中不起作用。

您得到一个 BOOL 结果,因为 = 符号被解释为比较运算符。

据我所知,您必须使用游标自己实现 window 函数(这可能不是性能方面的最佳解决方案,但它有效):

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, descrip 订购商品,而不是您问题中的 id。您应该根据自己的情况选择合适的顺序。