Общая функциональность табличных выражений в SQLite - PullRequest
2 голосов
/ 13 июля 2010

Мне нужно применить две последовательные агрегатные функции к набору данных (сумма ряда средних значений), что легко и обычно выполняется с помощью общих табличных выражений в SQL Server или другой СУБД, поддерживающей CTE. К сожалению, в настоящее время я застрял с SQLite, который не поддерживает CTE. Есть ли альтернатива или обходной путь для достижения того же результата в SQLite без выполнения двух запросов и свертывания результатов в коде?

Чтобы добавить еще несколько деталей, я не думаю, что это может быть легко сделано с представлениями, потому что первый набор агрегатных значений должен быть получен на основе предложения WHERE с несколькими параметрами. Например,

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

И тогда мне нужна сумма этих средних.

Ответы [ 3 ]

8 голосов
/ 04 июня 2014

Теперь, когда мы находимся в БУДУЩЕМ, позвольте мне заметить, что SQLite теперь поддерживает Поддержка общих табличных выражений, начиная с версии 3.8.3 2014-02-03.1005 *http://www.sqlite.org/lang_with.html

3 голосов
/ 13 июля 2010

Будет ли это работать?

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 голосов
/ 13 июля 2010

Как вы упомянули, SQLite не поддерживает CTE, оконные функции или что-либо подобное.

Однако вы можете написать свои собственные пользовательские функции, которые вы можете вызывать внутри SQLite, зарегистрировав их в базе данных с помощью API SQLite, используя sqlite_create_function () . Вы регистрируете их в базе данных, а затем можете использовать их в своем собственном коде приложения. Вы можете создать агрегатную функцию, которая будет выполнять сумму ряда средних значений на основе значений отдельных столбцов. Для каждого значения вызывается функция обратного вызова типа шага, которая позволяет выполнить некоторые вычисления для данных, а также доступен указатель для хранения данных состояния.

В вашем SQL вы можете зарегистрировать пользовательскую функцию sum_of_series_of_averages и иметь:

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

Для некоторых хороших примеров того, как они работают, вы должны проверить исходный код SQLite, а также это руководство (поиск по Defining SQLite User Functions).

...