SQLite中的公用表表达式功能

时间:2010-07-12 22:43:16

标签: sqlite common-table-expression

我需要将两个连续的聚合函数应用于数据集(一系列平均值的总和),这是使用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

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

3 个答案:

答案 0 :(得分:8)

现在我们处于未来状态,请注意,自2014-02-03版本3.8.3起,SQLite现在支持支持公用表格式。

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

答案 1 :(得分: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()平均值。

这是你在找什么?

答案 2 :(得分: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源代码,并查看this tutorial(搜索Defining SQLite User Functions)。