在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进行查询,但我无法弄清楚如何使其工作。
感谢您阅读我的问题
答案 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中不起作用;显然你不能在子查询中引用多层嵌套之外的表。