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
。您应该根据自己的情况选择合适的顺序。
我使用的是优势数据库服务器版本: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
。您应该根据自己的情况选择合适的顺序。