Alternative for recursive aggregate queries not supported in sqlite3What is tail recursion?How to generate “empty” aggregate results in SQLReturn column based on underlying rows in aggregate queryCan peewee nest SELECT queries such that the outer query selects on an aggregate of the inner query?SQL: How to select window functions alongside aggregate functionshow to use recursion to formulate using simple arrayAggregate function on one column, group by on another, leave a third unaffectedAggregate function that returns any value for a grouprecursive (cascade) selection in python sqlite3What is the most efficient way to store 2-D timeseries in a database (sqlite3)
During copyediting, journal disagrees about spelling of paper's main topic
A pyramid from a square
Robbers: The Hidden OEIS Substring
For a hashing function like MD5, how similar can two plaintext strings be and still generate the same hash?
Maximum charterer insertion
Supporting developers who insist on using their pet language
Is Trump personally blocking people on Twitter?
Why are Hobbits so fond of mushrooms?
As the Dungeon Master, how do I handle a player that insists on a specific class when I already know that choice will cause issues?
definition of "percentile"
Parse source code of the RAPID robot-automation language
Can I play a first turn Simic Growth Chamber to have 3 mana available in the second turn?
The monorail explodes before I can get on it
In Parshas Chukas, why is first mention of Parah Adumah "פָרָה" instead of "פָּרָה"?
Print the last, middle and first character of your code
Was lunar module "pilot" Harrison Schmitt legally a "pilot" at the time?
Why do players in the past play much longer tournaments than today's top players?
Novel where a group of scientists in a spaceship encounter various aliens
How might the United Kingdom become a republic?
How does a Potion of Poison work?
How can I deal with a player trying to insert real-world mythology into my homebrew setting?
How to find the shape parameters of of a beta distribution given the position of two quantiles?
Why does the U.S. tolerate foreign influence from Saudi Arabia and Israel on its domestic policies while not tolerating that from China or Russia?
What would be the ideal melee weapon made of "Phase Metal"?
Alternative for recursive aggregate queries not supported in sqlite3
What is tail recursion?How to generate “empty” aggregate results in SQLReturn column based on underlying rows in aggregate queryCan peewee nest SELECT queries such that the outer query selects on an aggregate of the inner query?SQL: How to select window functions alongside aggregate functionshow to use recursion to formulate using simple arrayAggregate function on one column, group by on another, leave a third unaffectedAggregate function that returns any value for a grouprecursive (cascade) selection in python sqlite3What is the most efficient way to store 2-D timeseries in a database (sqlite3)
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;
I would like to perform a SQL computation of a system evolving in time as
v <- v + a (*) v
where v
is a vector of N
components (N >> 10
), a
is an N
-by-N
matrix, fairly sparse, (*)
denotes matrix multiplication, and the evolution is recursively computed as a sequence of timesteps, with each step using the previous value of v
. a
changes with time as an external factor, but it is sufficient for this question to assume a
is constant.
I could do this recursion loop in an imperative language, but the underlying data was kind of messy and SQL was brilliant for normalising. It would be kind of neat to just finish the job in one language.
I found that matrix multiplication is fine. Recursion is fine too, as of sqlite 3.8. But matrix multiplication inside a recursion loop does not appear to be possible. Here is my progress so far (also at http://sqlfiddle.com/#!5/ed521/1 ):
-- Example vector v
DROP TABLE IF EXISTS coords;
CREATE TABLE coords( row INTEGER PRIMARY KEY, val FLOAT );
INSERT INTO coords
VALUES
(1, 0.0 ),
(2, 1.0 );
-- Example matrix a
DROP TABLE IF EXISTS matrix;
CREATE TABLE matrix( row INTEGER, col INTEGER, val FLOAT, PRIMARY KEY( row, col ) );
INSERT INTO matrix
VALUES
( 1, 1, 0.0 ),
( 1, 2, 0.03 ),
( 2, 1, -0.03 ),
( 2, 2, 0.0 );
-- The timestep equation can also be expressed: v <- ( I + a ) (*) v, where the
-- identity matrix I is first added to a.
UPDATE matrix
SET val = val + 1.0
WHERE row == col;
-- Matrix multiply to evaluate the first step.
SELECT a.row AS row, SUM( a.val*v.val ) AS val
FROM coords v
JOIN matrix a
ON a.col == v.row
GROUP BY a.row;
Here is where the problem arises. I can't see how to do a matrix multiply without a GROUP BY
(aggregation) operation, but Sqlite3 specifically does not permit aggregation inside of a recursion loop:
-- Recursive matrix multiply to evaluate a sequences of steps.
WITH RECURSIVE trajectory( row, val ) AS
(
SELECT row, val
FROM coords
UNION ALL
SELECT a.row AS row, SUM( a.val*v.val ) AS val
FROM trajectory v -- recursive sequence of steps
--FROM coords v -- non-recursive first step only
JOIN matrix a
ON a.col == v.row
GROUP BY a.row
LIMIT 50
)
SELECT *
FROM trajectory;
Returns
Error: recursive aggregate queries not supported
No doubt the designers had some clear reason for excluding it! I am surprised that JOINs are allowed but GROUP BYs are not. I am not sure what my alternatives are, though.
I've found a few other recursion examples but they all seem to have carefully selected problems for which aggregation or self-joins inside the loop are not required. In the docs( https://www.sqlite.org/lang_with.html ) an example query walks a tree recursively, and performs an avg()
on the output. This is subtly different: the aggregation happens outside the loop, and tree-walking uses JOIN
s but no aggregation inside the recursion loop. That problem proceeds only because the recursion does not depend on the aggregations, as it does in this problem.
Another example, the Fibonacci generator is an example of an N = 2
linear dynamical system, but with N = 2
the implementations can just hard-code the two values and the matrix multiply directly into the query, so no aggregating SUM()
is needed. More generally with N >> 10
it is not feasible to go down this path.
Any help would be much appreciated. Thanks!
recursion sqlite aggregate-functions
add a comment |
I would like to perform a SQL computation of a system evolving in time as
v <- v + a (*) v
where v
is a vector of N
components (N >> 10
), a
is an N
-by-N
matrix, fairly sparse, (*)
denotes matrix multiplication, and the evolution is recursively computed as a sequence of timesteps, with each step using the previous value of v
. a
changes with time as an external factor, but it is sufficient for this question to assume a
is constant.
I could do this recursion loop in an imperative language, but the underlying data was kind of messy and SQL was brilliant for normalising. It would be kind of neat to just finish the job in one language.
I found that matrix multiplication is fine. Recursion is fine too, as of sqlite 3.8. But matrix multiplication inside a recursion loop does not appear to be possible. Here is my progress so far (also at http://sqlfiddle.com/#!5/ed521/1 ):
-- Example vector v
DROP TABLE IF EXISTS coords;
CREATE TABLE coords( row INTEGER PRIMARY KEY, val FLOAT );
INSERT INTO coords
VALUES
(1, 0.0 ),
(2, 1.0 );
-- Example matrix a
DROP TABLE IF EXISTS matrix;
CREATE TABLE matrix( row INTEGER, col INTEGER, val FLOAT, PRIMARY KEY( row, col ) );
INSERT INTO matrix
VALUES
( 1, 1, 0.0 ),
( 1, 2, 0.03 ),
( 2, 1, -0.03 ),
( 2, 2, 0.0 );
-- The timestep equation can also be expressed: v <- ( I + a ) (*) v, where the
-- identity matrix I is first added to a.
UPDATE matrix
SET val = val + 1.0
WHERE row == col;
-- Matrix multiply to evaluate the first step.
SELECT a.row AS row, SUM( a.val*v.val ) AS val
FROM coords v
JOIN matrix a
ON a.col == v.row
GROUP BY a.row;
Here is where the problem arises. I can't see how to do a matrix multiply without a GROUP BY
(aggregation) operation, but Sqlite3 specifically does not permit aggregation inside of a recursion loop:
-- Recursive matrix multiply to evaluate a sequences of steps.
WITH RECURSIVE trajectory( row, val ) AS
(
SELECT row, val
FROM coords
UNION ALL
SELECT a.row AS row, SUM( a.val*v.val ) AS val
FROM trajectory v -- recursive sequence of steps
--FROM coords v -- non-recursive first step only
JOIN matrix a
ON a.col == v.row
GROUP BY a.row
LIMIT 50
)
SELECT *
FROM trajectory;
Returns
Error: recursive aggregate queries not supported
No doubt the designers had some clear reason for excluding it! I am surprised that JOINs are allowed but GROUP BYs are not. I am not sure what my alternatives are, though.
I've found a few other recursion examples but they all seem to have carefully selected problems for which aggregation or self-joins inside the loop are not required. In the docs( https://www.sqlite.org/lang_with.html ) an example query walks a tree recursively, and performs an avg()
on the output. This is subtly different: the aggregation happens outside the loop, and tree-walking uses JOIN
s but no aggregation inside the recursion loop. That problem proceeds only because the recursion does not depend on the aggregations, as it does in this problem.
Another example, the Fibonacci generator is an example of an N = 2
linear dynamical system, but with N = 2
the implementations can just hard-code the two values and the matrix multiply directly into the query, so no aggregating SUM()
is needed. More generally with N >> 10
it is not feasible to go down this path.
Any help would be much appreciated. Thanks!
recursion sqlite aggregate-functions
Version is SQLite 3.16.2.
– schieghoven
Mar 26 at 3:30
Postgres 9.6 recursive CTEs have the same restriction.
– schieghoven
Apr 4 at 6:35
I could not find any solution in sqlite and migrated the project to postgres to use RETURN QUERY inside a WHILE loop. It works well.
– schieghoven
Apr 4 at 6:39
add a comment |
I would like to perform a SQL computation of a system evolving in time as
v <- v + a (*) v
where v
is a vector of N
components (N >> 10
), a
is an N
-by-N
matrix, fairly sparse, (*)
denotes matrix multiplication, and the evolution is recursively computed as a sequence of timesteps, with each step using the previous value of v
. a
changes with time as an external factor, but it is sufficient for this question to assume a
is constant.
I could do this recursion loop in an imperative language, but the underlying data was kind of messy and SQL was brilliant for normalising. It would be kind of neat to just finish the job in one language.
I found that matrix multiplication is fine. Recursion is fine too, as of sqlite 3.8. But matrix multiplication inside a recursion loop does not appear to be possible. Here is my progress so far (also at http://sqlfiddle.com/#!5/ed521/1 ):
-- Example vector v
DROP TABLE IF EXISTS coords;
CREATE TABLE coords( row INTEGER PRIMARY KEY, val FLOAT );
INSERT INTO coords
VALUES
(1, 0.0 ),
(2, 1.0 );
-- Example matrix a
DROP TABLE IF EXISTS matrix;
CREATE TABLE matrix( row INTEGER, col INTEGER, val FLOAT, PRIMARY KEY( row, col ) );
INSERT INTO matrix
VALUES
( 1, 1, 0.0 ),
( 1, 2, 0.03 ),
( 2, 1, -0.03 ),
( 2, 2, 0.0 );
-- The timestep equation can also be expressed: v <- ( I + a ) (*) v, where the
-- identity matrix I is first added to a.
UPDATE matrix
SET val = val + 1.0
WHERE row == col;
-- Matrix multiply to evaluate the first step.
SELECT a.row AS row, SUM( a.val*v.val ) AS val
FROM coords v
JOIN matrix a
ON a.col == v.row
GROUP BY a.row;
Here is where the problem arises. I can't see how to do a matrix multiply without a GROUP BY
(aggregation) operation, but Sqlite3 specifically does not permit aggregation inside of a recursion loop:
-- Recursive matrix multiply to evaluate a sequences of steps.
WITH RECURSIVE trajectory( row, val ) AS
(
SELECT row, val
FROM coords
UNION ALL
SELECT a.row AS row, SUM( a.val*v.val ) AS val
FROM trajectory v -- recursive sequence of steps
--FROM coords v -- non-recursive first step only
JOIN matrix a
ON a.col == v.row
GROUP BY a.row
LIMIT 50
)
SELECT *
FROM trajectory;
Returns
Error: recursive aggregate queries not supported
No doubt the designers had some clear reason for excluding it! I am surprised that JOINs are allowed but GROUP BYs are not. I am not sure what my alternatives are, though.
I've found a few other recursion examples but they all seem to have carefully selected problems for which aggregation or self-joins inside the loop are not required. In the docs( https://www.sqlite.org/lang_with.html ) an example query walks a tree recursively, and performs an avg()
on the output. This is subtly different: the aggregation happens outside the loop, and tree-walking uses JOIN
s but no aggregation inside the recursion loop. That problem proceeds only because the recursion does not depend on the aggregations, as it does in this problem.
Another example, the Fibonacci generator is an example of an N = 2
linear dynamical system, but with N = 2
the implementations can just hard-code the two values and the matrix multiply directly into the query, so no aggregating SUM()
is needed. More generally with N >> 10
it is not feasible to go down this path.
Any help would be much appreciated. Thanks!
recursion sqlite aggregate-functions
I would like to perform a SQL computation of a system evolving in time as
v <- v + a (*) v
where v
is a vector of N
components (N >> 10
), a
is an N
-by-N
matrix, fairly sparse, (*)
denotes matrix multiplication, and the evolution is recursively computed as a sequence of timesteps, with each step using the previous value of v
. a
changes with time as an external factor, but it is sufficient for this question to assume a
is constant.
I could do this recursion loop in an imperative language, but the underlying data was kind of messy and SQL was brilliant for normalising. It would be kind of neat to just finish the job in one language.
I found that matrix multiplication is fine. Recursion is fine too, as of sqlite 3.8. But matrix multiplication inside a recursion loop does not appear to be possible. Here is my progress so far (also at http://sqlfiddle.com/#!5/ed521/1 ):
-- Example vector v
DROP TABLE IF EXISTS coords;
CREATE TABLE coords( row INTEGER PRIMARY KEY, val FLOAT );
INSERT INTO coords
VALUES
(1, 0.0 ),
(2, 1.0 );
-- Example matrix a
DROP TABLE IF EXISTS matrix;
CREATE TABLE matrix( row INTEGER, col INTEGER, val FLOAT, PRIMARY KEY( row, col ) );
INSERT INTO matrix
VALUES
( 1, 1, 0.0 ),
( 1, 2, 0.03 ),
( 2, 1, -0.03 ),
( 2, 2, 0.0 );
-- The timestep equation can also be expressed: v <- ( I + a ) (*) v, where the
-- identity matrix I is first added to a.
UPDATE matrix
SET val = val + 1.0
WHERE row == col;
-- Matrix multiply to evaluate the first step.
SELECT a.row AS row, SUM( a.val*v.val ) AS val
FROM coords v
JOIN matrix a
ON a.col == v.row
GROUP BY a.row;
Here is where the problem arises. I can't see how to do a matrix multiply without a GROUP BY
(aggregation) operation, but Sqlite3 specifically does not permit aggregation inside of a recursion loop:
-- Recursive matrix multiply to evaluate a sequences of steps.
WITH RECURSIVE trajectory( row, val ) AS
(
SELECT row, val
FROM coords
UNION ALL
SELECT a.row AS row, SUM( a.val*v.val ) AS val
FROM trajectory v -- recursive sequence of steps
--FROM coords v -- non-recursive first step only
JOIN matrix a
ON a.col == v.row
GROUP BY a.row
LIMIT 50
)
SELECT *
FROM trajectory;
Returns
Error: recursive aggregate queries not supported
No doubt the designers had some clear reason for excluding it! I am surprised that JOINs are allowed but GROUP BYs are not. I am not sure what my alternatives are, though.
I've found a few other recursion examples but they all seem to have carefully selected problems for which aggregation or self-joins inside the loop are not required. In the docs( https://www.sqlite.org/lang_with.html ) an example query walks a tree recursively, and performs an avg()
on the output. This is subtly different: the aggregation happens outside the loop, and tree-walking uses JOIN
s but no aggregation inside the recursion loop. That problem proceeds only because the recursion does not depend on the aggregations, as it does in this problem.
Another example, the Fibonacci generator is an example of an N = 2
linear dynamical system, but with N = 2
the implementations can just hard-code the two values and the matrix multiply directly into the query, so no aggregating SUM()
is needed. More generally with N >> 10
it is not feasible to go down this path.
Any help would be much appreciated. Thanks!
recursion sqlite aggregate-functions
recursion sqlite aggregate-functions
asked Mar 26 at 3:24
schieghovenschieghoven
62 bronze badges
62 bronze badges
Version is SQLite 3.16.2.
– schieghoven
Mar 26 at 3:30
Postgres 9.6 recursive CTEs have the same restriction.
– schieghoven
Apr 4 at 6:35
I could not find any solution in sqlite and migrated the project to postgres to use RETURN QUERY inside a WHILE loop. It works well.
– schieghoven
Apr 4 at 6:39
add a comment |
Version is SQLite 3.16.2.
– schieghoven
Mar 26 at 3:30
Postgres 9.6 recursive CTEs have the same restriction.
– schieghoven
Apr 4 at 6:35
I could not find any solution in sqlite and migrated the project to postgres to use RETURN QUERY inside a WHILE loop. It works well.
– schieghoven
Apr 4 at 6:39
Version is SQLite 3.16.2.
– schieghoven
Mar 26 at 3:30
Version is SQLite 3.16.2.
– schieghoven
Mar 26 at 3:30
Postgres 9.6 recursive CTEs have the same restriction.
– schieghoven
Apr 4 at 6:35
Postgres 9.6 recursive CTEs have the same restriction.
– schieghoven
Apr 4 at 6:35
I could not find any solution in sqlite and migrated the project to postgres to use RETURN QUERY inside a WHILE loop. It works well.
– schieghoven
Apr 4 at 6:39
I could not find any solution in sqlite and migrated the project to postgres to use RETURN QUERY inside a WHILE loop. It works well.
– schieghoven
Apr 4 at 6:39
add a comment |
0
active
oldest
votes
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55349403%2falternative-for-recursive-aggregate-queries-not-supported-in-sqlite3%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
0
active
oldest
votes
0
active
oldest
votes
active
oldest
votes
active
oldest
votes
Is this question similar to what you get asked at work? Learn more about asking and sharing private information with your coworkers using Stack Overflow for Teams.
Is this question similar to what you get asked at work? Learn more about asking and sharing private information with your coworkers using Stack Overflow for Teams.
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55349403%2falternative-for-recursive-aggregate-queries-not-supported-in-sqlite3%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Version is SQLite 3.16.2.
– schieghoven
Mar 26 at 3:30
Postgres 9.6 recursive CTEs have the same restriction.
– schieghoven
Apr 4 at 6:35
I could not find any solution in sqlite and migrated the project to postgres to use RETURN QUERY inside a WHILE loop. It works well.
– schieghoven
Apr 4 at 6:39