MS Access等效于在select中使用dense_rank

时间:2016-02-18 19:29:38

标签: sql ms-access select floor dense-rank

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

然后,我想为每个 5个不同的帐号分配一个批号序列。 (即 - 账号为ABC111的记录1与批号101相关联,记录2的账号为DEF222与批号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进行查询,但我无法弄清楚如何使其工作。

感谢您阅读我的问题

2 个答案:

答案 0 :(得分:1)

您可以使用相关子查询执行def update_make_models @models = MakeModel.where(make_id: params["diy"]["attached_vehicles_attributes"]["0"]["make"]) end 。逻辑是:

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; 生成一个数字,但您的批号不是数字)。但是,这应该回答你的问题。

编辑:

哦,没错。在MS Access中,您需要嵌套的子查询:

dense_rank()

答案 1 :(得分: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&lt; t.AccountNumber)q))\ 5 + 101 FROM db2inst1.account_table t

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