MS Access - Row_Number 分区方式
Posted
技术标签:
【中文标题】MS Access - Row_Number 分区方式【英文标题】:MS Access - Row_Number Partition by 【发布时间】:2020-07-16 16:38:23 【问题描述】:我正在尝试在 MS Access 中进行等效的 row_number 分区。
我有一个名为 FX_Rates 的货币表可供访问。
此表有一个货币字段、一个汇率字段和一个日期字段。 我想在一个字段中插入一个记录计数,该字段基本上会显示此表中是否有重复项,因为我想删除重复值,所以计数>1的任何内容。
例如,如果我有以下数据:
Currency ExchangeRate Date
EUR 1 31/12/2019
EUR 1 31/12/2019
GBP 1.1 31/12/2019
GBP 1.5 31/12/2019
我希望输出看起来像这样:
Currency ExchangeRate Date Count
EUR 1 31/12/2019 1
EUR 1 31/12/2019 2
GBP 1.1 31/12/2019 1
GBP 1.5 31/12/2019 1
通过在线查找,我想出了以下代码:
Call RunSQL("INSERT INTO FX_Rates_New " & _
"SELECT " & _
" t1.Currency, t1.Exchange_Rate, t1.Date_of_Report" & _
",COUNT(*) AS Count_of_Record " & _
"FROM FX_Rates AS t1 " & _
"INNER JOIN FX_Rates AS t2 ON t1.Currency = t2.Currency AND t1.Date_of_Report = t2.Date_of_Report " & _
"GROUP BY " & _
" t1.Currency, t1.Exchange_Rate, t1.Date_of_Report " & _
"ORDER BY t1.Date_of_Report, t1.Currency ")
然而,上面只是将唯一记录插入到一个新表中,而我知道只有 2 个的项目的计数为 4。
理想情况下,我想用上面演示的每个表旁边的计数来更新我当前的表。有谁知道最好的方法吗?
提前致谢,
编辑: 如果有人想以一种简单的方式做类似的事情,我实际上最终使用了以下代码,在 June7 的回复之后,我在 AutoNum 字段中添加了这使得完成我想要的事情变得更加容易:
Call RunSQL("DELETE * FROM FX_Rates " & _
"WHERE FX_Rates.ID NOT IN ( " & _
"SELECT Min(FX_Rates.ID) AS ID " & _
"FROM FX_Rates " & _
"GROUP BY " & _
"FX_Rates.Currency, FX_Rates.Date) ")
【问题讨论】:
【参考方案1】:需要一个唯一的记录标识符 - 应该提供一个自动编号字段(以下查询中的 ID)。考虑:
SELECT FX_Rates.Currency, FX_Rates.Exchange_Rate, FX_Rates.Date_of_Report,
(SELECT Count(*) AS HowMany
FROM FX_Rates AS Dupe
WHERE Dupe.ID < FX_Rates.ID AND Dupe.Currency=FX_Rates.Currency
AND Dupe.Exchange_Rate=FX_Rates.Exchange_Rate
AND Dupe.Date_of_Report=FX_Rates.Date_of_Report)+1 AS GrpSeq
FROM FX_Rates;
欲了解更多信息,请查看http://allenbrowne.com/ranking.html
【讨论】:
您好,谢谢或回复我,我已经绑定了这个,它对我不起作用,因为我的数据中没有名为 ID 的字段。您是否有理由包含以下内容:WHERE Dupe.ID 我发布的内容对我有用。您可以轻松地将自动编号字段添加到表中。 ID 是自动编号字段。 谢谢你,我在autonum中添加了,现在可以正常工作了。感谢您的帮助。以上是关于MS Access - Row_Number 分区方式的主要内容,如果未能解决你的问题,请参考以下文章
在 MS Access 中的查询表达式中出现语法错误(缺少运算符)
在禁用分区功能的 SQL 中使用分区上的 Row_number
ROW_NUMBER() OVER() 在一个奇怪的地方分区