在 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。