我正在使用版本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支持。
答案 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
。你应该根据自己的情况选择合适的订单。