为访问查询创建自定义聚合函数
Creating a Custom Aggregate Function for Access Queries
最多Common/Frequent/Dense值
我想找到(或创建一个自定义的)聚合函数用于 MS Access 查询,这将 return 最常见的值(即,"most frequently occurring item")按不同字段分组时。下面是我将如何使用它的一个示例 — 但我可以想到其他的。
示例数据:
Scenario:
I have hourly weather forecast data. Forecasts are updated
irregularly, one or more times a day, including a description
like
"sunny" or "cloudy" (which varies hour-by-hour).
"What is the most common Description
, per day, per forecast?
(You can also View or Download the sample data as an .xlsx
from here).
"Raw" 数据(选定字段):
DateTimePST updated description temperature windSpeed
2018-02-11 02:00 2018-02-06 17:53 cloudy -0.47 2.93
2018-02-11 02:00 2018-02-07 18:22 cloudy 2.09 8.92
2018-02-11 02:00 2018-02-08 22:48 rain 1.54 9.7
2018-02-11 03:00 2018-02-06 03:00 cloudy 0.13 4.31
2018-02-11 03:00 2018-02-06 17:53 cloudy -0.29 2.43
2018-02-11 03:00 2018-02-07 18:22 cloudy 1.97 5.79
2018-02-11 03:00 2018-02-08 22:48 snow 1.4 10.2
2018-02-11 04:00 2018-02-06 03:00 cloudy 0.16 4.07
2018-02-11 04:00 2018-02-06 17:53 cloudy 0.02 2.78
2018-02-11 04:00 2018-02-07 18:22 cloudy 1.89 5.54
2018-02-11 04:00 2018-02-08 22:48 snow 1.44 10.75
2018-02-11 05:00 2018-02-06 03:00 cloudy 0.14 3.83
…
…
分组:
使用这样的 'totals' 查询对数据进行分组:
SELECT Int([DateTimePST]) AS DatePST, a.updated, i.description, Count(a.id) AS cnt
FROM tblWeatherData AS a
LEFT JOIN tblIconsToDesc AS i
ON a.icon = i.icon
GROUP BY Int([DateTimePST]), a.updated, i.description
ORDER BY Int([DateTimePST]), a.updated, Count(a.id) DESC;
...生成一个有序列表,显示哪些 Description
最常出现:
...但我只需要列出 "Top 1" for each DatePST
|Updated
|Description
组合,像这样"desired output":
"Ties" 需要被忽略(空或零长度),或者 理想情况下 ,连接成单个值,如cloudy, clear
,其中每个在那个日期有 12 条记录|预测)。
"End Goal" 是这样的交叉表样式输出:
这将用于相当大的数据集,因此手动计算是不可能的。我可以用 VBA 完全完成它,但这需要大量的工作,所以我希望有一种方法可以创建一个可以使用的 自定义聚合函数 在访问交叉表的 "Value" 部分。
在研究解决方案时,我发现 SQL 服务器可以非常简单地添加自定义聚合函数(如 this or this),并且 T-SQL 甚至内置可能会完成这项工作的功能,例如:
DENSE_RANK
,或者也许。
...所以我希望有一种方法可以在 VBA 中做类似的事情,而不必重新发明轮子。
欢迎任何想法。
Access 不支持自定义聚合。不过,您可以使用自定义域聚合。
Allen Browne 有一个示例自定义域聚合。但是,这些会对性能产生重大影响。
要找出出现次数最多的值,推荐的方法是使用子查询。
解决这个问题需要多个步骤,在我看来,解决所有这些问题对于 SO 来说太宽泛了。
select 每个类别的最高记录的后续步骤是:
SELECT DatePST, Updated, Description
FROM YourGroupByQuery q
WHERE [Count] = (
SELECT Max(s.[Count])
FROM YourGroupByQuery s
WHERE s.[DatePST] = q.[DatePST] And s.[Updated] = q.[Updated]
)
最多Common/Frequent/Dense值
我想找到(或创建一个自定义的)聚合函数用于 MS Access 查询,这将 return 最常见的值(即,"most frequently occurring item")按不同字段分组时。下面是我将如何使用它的一个示例 — 但我可以想到其他的。
示例数据:
Scenario:
I have hourly weather forecast data. Forecasts are
updated
irregularly, one or more times a day, including adescription
like "sunny" or "cloudy" (which varies hour-by-hour)."What is the most common
Description
, per day, per forecast?(You can also View or Download the sample data as an
.xlsx
from here).
"Raw" 数据(选定字段):
DateTimePST updated description temperature windSpeed
2018-02-11 02:00 2018-02-06 17:53 cloudy -0.47 2.93
2018-02-11 02:00 2018-02-07 18:22 cloudy 2.09 8.92
2018-02-11 02:00 2018-02-08 22:48 rain 1.54 9.7
2018-02-11 03:00 2018-02-06 03:00 cloudy 0.13 4.31
2018-02-11 03:00 2018-02-06 17:53 cloudy -0.29 2.43
2018-02-11 03:00 2018-02-07 18:22 cloudy 1.97 5.79
2018-02-11 03:00 2018-02-08 22:48 snow 1.4 10.2
2018-02-11 04:00 2018-02-06 03:00 cloudy 0.16 4.07
2018-02-11 04:00 2018-02-06 17:53 cloudy 0.02 2.78
2018-02-11 04:00 2018-02-07 18:22 cloudy 1.89 5.54
2018-02-11 04:00 2018-02-08 22:48 snow 1.44 10.75
2018-02-11 05:00 2018-02-06 03:00 cloudy 0.14 3.83
…
…
分组:
使用这样的 'totals' 查询对数据进行分组:
SELECT Int([DateTimePST]) AS DatePST, a.updated, i.description, Count(a.id) AS cnt
FROM tblWeatherData AS a
LEFT JOIN tblIconsToDesc AS i
ON a.icon = i.icon
GROUP BY Int([DateTimePST]), a.updated, i.description
ORDER BY Int([DateTimePST]), a.updated, Count(a.id) DESC;
...生成一个有序列表,显示哪些 Description
最常出现:
...但我只需要列出 "Top 1" for each DatePST
|Updated
|Description
组合,像这样"desired output":
"Ties" 需要被忽略(空或零长度),或者 理想情况下 ,连接成单个值,如cloudy, clear
,其中每个在那个日期有 12 条记录|预测)。
"End Goal" 是这样的交叉表样式输出:
这将用于相当大的数据集,因此手动计算是不可能的。我可以用 VBA 完全完成它,但这需要大量的工作,所以我希望有一种方法可以创建一个可以使用的 自定义聚合函数 在访问交叉表的 "Value" 部分。
在研究解决方案时,我发现 SQL 服务器可以非常简单地添加自定义聚合函数(如 this or this),并且 T-SQL 甚至内置可能会完成这项工作的功能,例如:
DENSE_RANK
,或者也许。
...所以我希望有一种方法可以在 VBA 中做类似的事情,而不必重新发明轮子。
欢迎任何想法。
Access 不支持自定义聚合。不过,您可以使用自定义域聚合。
Allen Browne 有一个示例自定义域聚合。但是,这些会对性能产生重大影响。
要找出出现次数最多的值,推荐的方法是使用子查询。
解决这个问题需要多个步骤,在我看来,解决所有这些问题对于 SO 来说太宽泛了。
select 每个类别的最高记录的后续步骤是:
SELECT DatePST, Updated, Description
FROM YourGroupByQuery q
WHERE [Count] = (
SELECT Max(s.[Count])
FROM YourGroupByQuery s
WHERE s.[DatePST] = q.[DatePST] And s.[Updated] = q.[Updated]
)