2

在 MS Access 中,我有一个包含 200 万条帐户记录/行的表,其中包含各种数据列。我希望将序列号应用于每个帐户记录。(即- 1 用于第一个帐户记录 ABC111,2 用于第二个帐户记录 DEF222 ...,等等)

然后,我想为每5 个不同的帐号分配一个批号序列。(即 - 帐号 ABC111 的记录 1 与批号 101 关联,帐号 DEF222 的记录 2 与批号 101 关联)

这就是我使用 sql server 查询的方式:

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 进行查询,但我不知道如何使其工作。

感谢您阅读我的问题

4

2 回答 2

1

您可以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;
于 2016-02-18T19:44:51.150 回答
1

这样的事情可能会奏效。

我首先创建一个临时表来保存不同的帐号,然后我会执行更新查询来分配排名。

CREATE TABLE tmpAccountRank
    (AccountNumber TEXT(10)
        CONSTRAINT PrimaryKey PRIMARY KEY,
    AccountRank INTEGER NULL);

然后我会使用这个表来生成帐户排名。

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 中的做法。

如果您想跳过临时表,您可以在嵌套子查询中完成所有操作,但我认为在单个查询中执行太多操作并不是一个好习惯,尤其是在 MS Access 中。

SELECT AccountNumber, (SELECT COUNT(*) FROM (SELECT DISTINCT AccountNumber FROM db2inst1.account_table WHERE AccountNumber < t.AccountNumber) q)) \ 5 + 101 FROM db2inst1.account_table t

实际上,这在 MS Access 中是行不通的;显然,您不能在子查询中引用多层嵌套之外的表。

于 2016-02-18T19:50:35.497 回答