ADS在更改id变量时重置行号将返回false

时间:2016-12-11 08:48:21

标签: sql window-functions row-number advantage-database-server

我正在使用版本Advantage Database Server:10.10.0.49。

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

我在MySQL上测试了类似的代码,但它确实有用。

使用Advantage,变量都返回'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

...返回

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 .. Partition By不受ADS支持。

1 个答案:

答案 0 :(得分: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, descrip订购商品,而非id。你应该根据自己的情况选择合适的订单。