On 12-09-15 16:36, Aurel Wisse wrote:
> Yes it works, but it takes forever. By comparison:
>
> Original recursive query: 7-8 seconds (SQLite 3.8.10.1)
> Non recursive query (see below): 18-19 seconds. (SQLite 3.8.10.1)
> Proposed query: Not finished after 10 minutes. I am cancelling.
>
> Non recursive query with same result:
>
> CREATE TEMP TABLE dateoff AS
> WITH dates AS (SELECT DISTINCT calc_date FROM wts_next_day
> WHERE strftime('%w', calc_date)<>'0')
> SELECT dt1.calc_date AS calc_date, min(dt2.calc_date) AS tmw
> FROM dates AS dt1, dates AS dt2
> ON dt2.calc_date > dt1.calc_date
> GROUP BY dt1.calc_date;
>
> So the recursive option is still way ahead.
>
>
> On Sat, Sep 12, 2015 at 10:01 AM, E.Pasma <pasma10 at concepts.nl> wrote:
>
>> Op 12 sep 2015, om 13:48 heeft Aurel Wisse het volgende geschreven:
>>
>>>
>>> Here is the example. It doesn't use an actual aggregation (sum, count),
>>> but
>>> the
>>>
>>> "min" aggregate function.
>>>
>>>
>>>  From a list of dates, create a lookup table with two
>>>
>>> columns: the original date (calc_date) and the date after calc_date (tmw).
>>>
>>>
>>> CREATE TABLE offsets AS
>>>
>>> WITH RECURSIVE dtoff(calc_date, tmw) AS (
>>>
>>> WITH dates(cd) AS (SELECT DISTINCT calc_date FROM securities)
>>>
>>> SELECT NULL, min(cd) FROM dates
>>>
>>> UNION
>>>
>>> SELECT dtoff.tmw, min(dates.cd) FROM dtoff, dates
>>>
>>> WHERE dates.cd > dtoff.tmw AND dtoff.tmw NOTNULL
>>>
>>> AND strftime('%%w', dates.cd)<>'0')
>>>
>>> SELECT * from dtoff WHERE calc_date NOTNULL ORDER BY calc_date;
>>>
>>>
>> The query below should work.
>> I hope that that is not a matter of good luck?
>>
>> CREATE TABLE securities(calc_date)
>> ;
>> WITH RECURSIVE dtoff(calc_date, tmw) AS (
>>
>> WITH dates(cd) AS (SELECT DISTINCT calc_date FROM securities)
>>
>> SELECT NULL, min(cd) FROM dates
>>
>> UNION
>>
>> SELECT dtoff.tmw,
>>          -- begin change 150912
>>          (
>>      SELECT min(dates.cd)
>>      FROM dates
>>      WHERE dates.cd > dtoff.tmw
>>      AND strftime('%%w', dates.cd)<>'0'
>>          )
>>          -- end change 150912
>> FROM dtoff
>> WHERE dtoff.tmw NOTNULL
>>      )
>> SELECT * from dtoff WHERE calc_date NOTNULL ORDER BY calc_date;
>>
>> ~
>>
>> _______________________________________________
>> sqlite-users mailing list
>> sqlite-users at mailinglists.sqlite.org
>> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
>>
>
>
What about this one? i cannot test because i do not have (enough) 
data..... ;)


WITH RECURSIVE dtoff(calc_date, tmw) AS (
   WITH dates(cd) AS (SELECT DISTINCT calc_date FROM securities)
   SELECT NULL, min(cd) FROM dates

   UNION

   SELECT dtoff.tmw, (dates.cd) FROM dtoff, dates
   WHERE dates.cd > dtoff.tmw AND dtoff.tmw NOTNULL
   AND strftime('%%w', dates.cd)<>'0')

SELECT * from dtoff  d1
WHERE calc_date NOTNULL
   AND (SELECT cOUNT(*) FROM dtoff d2 WHERE d2.calc_date=d1.calc_date 
and d2.tmw>d1.tmw)=0
ORDER BY calc_date;

Reply via email to