Yes, that works, even with missing data. The final query is:

SELECT STRFTIME('%Y-%m-%d %H %M', MIN(date)) AS Date,
(SELECT open from eurusd e2
where CAST(STRFTIME('%s', e2.date) AS INTEGER) >=
CAST(STRFTIME('%s', e1.date) AS INTEGER) / (5 * 60) * 5 * 60
order by e2.date asc limit 1) AS Open,
MAX(high) as High,
MIN(low) as Low,
(SELECT close from eurusd e3
where CAST(STRFTIME('%s', e3.date) AS INTEGER) <
(CAST(STRFTIME('%s', e1.date) AS INTEGER) / (5 * 60) + 1) * 5 * 60
order by e3.date desc limit 1) AS Close
FROM eurusd e1
GROUP BY CAST(STRFTIME('%s', e1.date) / (5 * 60) AS INTEGER)

The problem is that is veeeeery slooooow. It takes nearly 24 hours to query 1 year of Forex data in my laptop (and I have to work with 10 years periods). I will spend a couple of days learning about sqlite optimization.

Many thanks for all the answers.

Rafael


El 13/12/2011 15:06, 雷钦 escribió:
I think this can work

SELECT STRFTIME('%Y-%m-%d %H %M', date) AS Date,
        (SELECT open from eurusd e2
                    where STRFTIME(e2.date)>= CAST(STRFTIME('%s', e1.date) / (5 
* 60) AS INTEGER) * 5 * 60
                                order by e2.date asc limit 1) AS Open,
        MAX(high) as High,
        MIN(low) as Low,
        (SELECT close from eurusd e3
                    where STRFTIME(e3.date)<  (CAST(STRFTIME('%s', e1.date) / 
(5 * 60) AS INTEGER) + 1) * 5 * 60
                                order by e3.date desc limit 1) AS Close
FROM eurusd e1
     GROUP BY CAST(STRFTIME('%s', e1.date) / (5 * 60) AS INTEGER)

On 2011-12-12 15:45:41 +0100, Rafael Garcia Leiva wrote:
El 24/11/2011 19:18, Rafael Garcia Leiva escribió:

Dear all,

I'm still working on this problem :-(

Now I need the Open and the Close of the 5 minutes interval, where
Open is the Open of the first minute of the interval, and Close is
the Close of the last minute of the interval. I know how to get that
information with individual queries, for example:

SELECT open, date FROM eurusd WHERE date IN
     (select min(date) from eurusd group by STRFTIME("%Y-%m-%d", date));

But it would be very nice (and perhaps more computationally
efficient?) to get all the information, that is Open, High, Low and
Close in just one single query. I have tried something like:

SELECT STRFTIME('%Y-%m-%d %H %M', date) AS Date,
        (SELECT open from eurusd e2 where e2.date = MIN(e1.date)) AS Open,
        MAX(high) as High,
        MIN(low) as Low,
        (SELECT close from eurusd e3 where e3.date = MAX(e1.date)) AS Close
FROM eurusd e1
     GROUP BY CAST(STRFTIME('%s', e1.date) / (5 * 60) AS INTEGER)

but I have got an error of "misuse of aggregate function MIN()".

Any help would be very welcome. Also I would like to apologize if
this question is not relevant to the sqlite mailing list.

Best regards

Rafael




_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users


_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to