为访问查询创建自定义聚合函数

Posted

技术标签:

【中文标题】为访问查询创建自定义聚合函数【英文标题】:Creating a Custom Aggregate Function for Access Queries 【发布时间】:2018-07-20 03:09:24 【问题描述】:

最常见/频繁/密集值

我想查找(或创建自定义)聚合函数以用于 MS Access 查询,它将返回最常见的值(即,“最常出现的项目”)按不同字段分组时。下面是我如何使用它的一个示例——但我可以想到其他示例。


样本数据:

场景:

我有每小时的天气预报数据。预测是updated 不定期,一天一次或多次,包括description 喜欢 “晴天”或“阴天”(每小时变化)。

“每天,每个预测中最常见的Description 是什么?

(您还可以从here 以.xlsx 的形式查看或下载示例数据)。


“原始”数据(选定字段):

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
…
…

分组:

使用这样的“总计”查询对数据进行分组:

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 最常出现:

...但我只需要列出 每个 DatePST|Updated|Description 组合的“前 1”,就像这样“期望输出”:

"Ties" 需要被忽略(null 或零长度),或者理想情况下,连接成单个值,例如 cloudy, clear,每个值有 12 个该日期的记录|预测)。

“最终目标”是这样的交叉表式输出:

这将用于相当大的数据集,因此手动计算是不可能的。我可以用 VBA 完全完成它,但这需要大量的工作,所以我希望有一种方法可以创建一个 自定义聚合函数,可以在访问交叉表。

在研究解决方案时,我发现 SQL Server 可以非常简单地添加自定义聚合函数(如 this 或 this),而且 T-SQL 甚至具有可能完成这项工作的内置函数,喜欢:

DENSE_RANK,或者可能。

TOP 1 WITH TIES,

...所以我希望有一种方法可以在 VBA 中做类似的事情,而不必重新发明***。

感谢任何想法。

【问题讨论】:

【参考方案1】:

Access 不支持自定义聚合。不过,您可以使用自定义域聚合。

Allen Browne 有一个示例自定义域聚合。但是,这些都会对性能产生重大影响。

要识别最频繁的值,推荐的方法是使用子查询。

解决这个问题需要多个步骤,在我看来,解决所有这些问题对于 SO 来说过于宽泛。

选择每个类别的最高记录的后续步骤是:

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]
)

【讨论】:

以上是关于为访问查询创建自定义聚合函数的主要内容,如果未能解决你的问题,请参考以下文章

使用 jOOQ 创建自定义聚合函数

使用 plsql 的用户定义的自定义聚合函数

SqlServer如何用Sql语句自定义聚合函数

Oracle 的用户自定义聚合函数可以定义为与两列一起使用吗?

pandas groupby中的自定义聚合函数

加速自定义聚合函数