2

我需要将两个连续的聚合函数应用于数据集(一系列平均值的总和),这可以通过 SQL Server 或另一个支持 CTE 的 DBMS 中的公用表表达式轻松且常规地完成。不幸的是,我目前坚持使用不支持 CTE 的 SQLite。是否有替代方法或解决方法可以在 SQLite 中实现相同的结果,而无需执行两个查询并在代码中汇总结果?

要添加更多细节,我认为使用视图不容易做到这一点,因为需要根据具有多个参数的 WHERE 子句检索第一组聚合值。例如,

SELECT avg(elapsedTime)
FROM statisticsTable
WHERE connectionId in ([lots of values]) AND 
      updateTime > [startTime] AND
      updateTime < [endTime]
GROUP BY connectionId

然后我需要这些平均值的总和。

4

3 回答 3

8

既然我们处于未来,让我在这里指出,SQLite 现在确实支持公用表表达式,从 2014-02-03 的版本 3.8.3 开始。

http://www.sqlite.org/lang_with.html

于 2014-06-03T22:17:54.933 回答
3

这行得通吗?

SELECT SUM(t.time) as sum_of_series_of_averages
FROM
(
SELECT avg(elapsedTime) as time
FROM statisticsTable
WHERE connectionId in ([lots of values]) AND 
      updateTime > [startTime] AND
      updateTime < [endTime]
GROUP BY connectionId
) as t

通过将平均值转换为内联视图,您可以 SUM() 平均值。

这是你想要的?

于 2010-07-12T23:14:50.413 回答
2

正如您所提到的,SQLite 不支持 CTE、窗口函数或任何类似的东西。

但是,您可以编写自己的用户函数,您可以通过使用sqlite_create_function()使用 SQLite API 将它们注册到数据库来在 SQLite 内部调用这些函数。您将它们注册到数据库中,然后您可以在您自己的应用程序代码中使用它们。您可以创建一个聚合函数,该函数将根据各个列的值执行一系列平均值的总和。对于每个值,都会调用一个步进类型的回调函数,允许您对数据执行一些计算,并且还可以使用一个用于保存状态数据的指针。

那么,在您的 SQL 中,您可以注册一个名为 sum_of_series_of_averages 的自定义函数并具有:

SELECT sum_of_series_of_averages(columnA,columnB)
FROM table
WHERE ...

有关它们如何工作的一些很好的示例,您应该查看 SQLite 源代码,并查看本教程(搜索Defining SQLite User Functions)。

于 2010-07-12T22:55:11.560 回答