在 select 中使用 dense_rank 的 MS Access 等价物
MS Access equivalent for using dense_rank in select
在 MS Access 中,我有一个 table 有 200 万帐户 records/rows 和各种数据列。我希望为每个帐户记录应用一个序列号。 (即 - 第一个账户记录 ABC111 为 1,第二个账户记录 DEF222 为 2...,等等)
然后,我想为每个 5 个不同的帐号 分配一个批号序列。 (即 - 帐号 ABC111 的记录 1 与批号 101 相关联,帐号 DEF222 的记录 2 与批号 101 相关联)
这就是我使用 sql 服务器查询的方式:
select distinct(p.accountnumber),FLOOR(((50 + dense_rank() over(order by
p.accountnumber)) - 1)/5) + 100 As BATCH from
db2inst1.account_table p
原始数据:
AccountNumber
ABC111
DEF222
GHI333
JKL444
MNO555
PQR666
STU777
结果数据:
RecordNumber AccountNumber BatchNumber
1 ABC111 101
2 DEF222 101
3 GHI333 101
4 JKL444 101
5 MNO555 101
6 PQR666 102
7 STU777 102
我尝试使用 SELECT 和 DENSE_RANK 进行查询,但我不知道如何让它工作。
感谢阅读我的问题
您可以对相关子查询执行 dense_rank()
。逻辑是:
select a.*,
(select count(distinct a2.accountnumber)
from db2inst1.account_table as a2
where a2.accountnumber <= a.accountnumber
) as dense_rank
from db2inst1.account_table as a;
然后,您可以使用它来获取批号。不幸的是,我不遵循你问题中的逻辑(dense_rank()
产生一个数字,但你的批号不是数字)。但是,这应该可以回答您的问题。
编辑:
哦,对了。在 MS Access 中,您需要嵌套子查询:
select a.*,
(select count(*)
from (select distinct a2.accountnumber
from db2inst1.account_table as a2
) as a2
where a2.accountnumber <= a.accountnumber
) as dense_rank
from db2inst1.account_table as a;
像这样的东西可能会起作用。
我会先创建一个临时 table 来保存不同的帐号,然后我会执行更新查询来分配排名。
CREATE TABLE tmpAccountRank
(AccountNumber TEXT(10)
CONSTRAINT PrimaryKey PRIMARY KEY,
AccountRank INTEGER NULL);
然后我将使用此 table 生成帐户排名。
DELETE FROM tmpAccountRank;
INSERT INTO tmpAccountRank(AccountNumber)
SELECT DISTINCT AccountNumber FROM db2inst1.account_table;
UPDATE tmpAccountRank
SET AccountRank =
DCOUNT('AccountNumber', 'tmpAccountRank',
'AccountNumber < ''' + AccountNumber + '''') \ 5 + 101
我使用 DCOUNT 和整数除法 (\5) 来生成排名。这可能会有糟糕的性能,但我认为这是您在 MS Access 中执行此操作的方式。
如果你想跳过临时 table,你可以在嵌套子查询中完成所有操作,但我认为在单个中做太多并不是一个很好的做法查询,尤其是在 MS Access 中。
SELECT 帐号,
(SELECT 计数(*) 来自
(SELECT 不同的帐号
来自 db2inst1.account_table
其中帐号 < t.AccountNumber) q)) \ 5 + 101
从 db2inst1.account_table t
实际上,这在 MS Access 中不起作用;显然你不能在子查询的多层嵌套之外引用 tables。
在 MS Access 中,我有一个 table 有 200 万帐户 records/rows 和各种数据列。我希望为每个帐户记录应用一个序列号。 (即 - 第一个账户记录 ABC111 为 1,第二个账户记录 DEF222 为 2...,等等)
然后,我想为每个 5 个不同的帐号 分配一个批号序列。 (即 - 帐号 ABC111 的记录 1 与批号 101 相关联,帐号 DEF222 的记录 2 与批号 101 相关联)
这就是我使用 sql 服务器查询的方式:
select distinct(p.accountnumber),FLOOR(((50 + dense_rank() over(order by
p.accountnumber)) - 1)/5) + 100 As BATCH from
db2inst1.account_table p
原始数据:
AccountNumber
ABC111
DEF222
GHI333
JKL444
MNO555
PQR666
STU777
结果数据:
RecordNumber AccountNumber BatchNumber
1 ABC111 101
2 DEF222 101
3 GHI333 101
4 JKL444 101
5 MNO555 101
6 PQR666 102
7 STU777 102
我尝试使用 SELECT 和 DENSE_RANK 进行查询,但我不知道如何让它工作。
感谢阅读我的问题
您可以对相关子查询执行 dense_rank()
。逻辑是:
select a.*,
(select count(distinct a2.accountnumber)
from db2inst1.account_table as a2
where a2.accountnumber <= a.accountnumber
) as dense_rank
from db2inst1.account_table as a;
然后,您可以使用它来获取批号。不幸的是,我不遵循你问题中的逻辑(dense_rank()
产生一个数字,但你的批号不是数字)。但是,这应该可以回答您的问题。
编辑:
哦,对了。在 MS Access 中,您需要嵌套子查询:
select a.*,
(select count(*)
from (select distinct a2.accountnumber
from db2inst1.account_table as a2
) as a2
where a2.accountnumber <= a.accountnumber
) as dense_rank
from db2inst1.account_table as a;
像这样的东西可能会起作用。
我会先创建一个临时 table 来保存不同的帐号,然后我会执行更新查询来分配排名。
CREATE TABLE tmpAccountRank
(AccountNumber TEXT(10)
CONSTRAINT PrimaryKey PRIMARY KEY,
AccountRank INTEGER NULL);
然后我将使用此 table 生成帐户排名。
DELETE FROM tmpAccountRank;
INSERT INTO tmpAccountRank(AccountNumber)
SELECT DISTINCT AccountNumber FROM db2inst1.account_table;
UPDATE tmpAccountRank
SET AccountRank =
DCOUNT('AccountNumber', 'tmpAccountRank',
'AccountNumber < ''' + AccountNumber + '''') \ 5 + 101
我使用 DCOUNT 和整数除法 (\5) 来生成排名。这可能会有糟糕的性能,但我认为这是您在 MS Access 中执行此操作的方式。
如果你想跳过临时 table,你可以在嵌套子查询中完成所有操作,但我认为在单个中做太多并不是一个很好的做法查询,尤其是在 MS Access 中。
SELECT 帐号,
(SELECT 计数(*) 来自
(SELECT 不同的帐号
来自 db2inst1.account_table
其中帐号 < t.AccountNumber) q)) \ 5 + 101
从 db2inst1.account_table t
实际上,这在 MS Access 中不起作用;显然你不能在子查询的多层嵌套之外引用 tables。