No way to set an index... perhaps you could use caching.

On Tuesday, January 8, 2013 1:27:46 AM UTC-7, Paolo valleri wrote:
>
> Thanks for this explanations! To add more info, I can say that the 
> elements on left column are naturally ordered, I have thousands of 
> records(~5000record/day) for each station but only a few 
> station_id(~5-10stations totally). 
> Instead of making a complex query, a cleaner approach would be to run the 
> query with only the join and then do a loop in python to remove the 
> unnecessary lines.
>
> Moreover, right now, the worst think is that since I switched to postgres 
> the initial query (the one with only the leftjoin) is taking minutes to be 
> executed (almost 4m) against just few seconds on sqlite. I set an index on 
> the mac field through pgAdmin and the results are really better, 
> unfortunately this hack is not portable, is there a way to define indexes 
> from web2py?
>
> Paolo
>
>
> 2013/1/8 Niphlod <nip...@gmail.com <javascript:>>
>
>> after a full day at work I may lack the usual fantasy, but what you're 
>> trying to do can't be even achieved by a "relatively simple" windowed 
>> function....
>> What you're trying to do is recursing..... way out of DAL reach (if you 
>> want to do it in a single query)
>> Trying to explain better....
>>
>> Real data helps.....
>> For every station_id record with the same mac address you want to find 
>> the "min gathered_on" record from the same table (with another station_id) 
>> and "subtract it" for every next possible match.
>>
>> One thing is requiring
>>
>> "2013-01-21 11:23:35";"a";127167;"2013-01-21 11:23:45";"a";127168
>> "2013-01-21 11:23:00";"a";127169;"2013-01-21 11:23:45";"a";127168
>> That can be accomplished by something like this
>>
>> select * from (
>>     select    start_point.gathered_on,start_point.mac,start_point.id,
>> end_point.gathered_on,end_point.mac,end_point.id, 
>> row_number() over (partition by start_point.id order by end_point.
>> gathered_on) as filter_field
>> from record as start_point
>> inner join
>> record as end_point
>> on start_point.mac = end_point.mac
>> and start_point.gathered_on <= end_point.gathered_on
>> where start_point.station_id = 13
>> and end_point.station_id = 14
>> ) as q
>> where q.filter_field = 1
>>
>> because for the record 127167 the next record with another station_id is 
>> 127168, but then for the 127169 you don't want the 127168, you want 127170 
>> because 127168 "has been booked before" by 127169. 
>>
>> Honestly, (beware of the lack of fantasy :P) I'd do a loop in python 
>> instead of using recursing in the db itself unless you have zillions of 
>> "windows" (i.e. you have 1000 station_id = 13 and 1000 station_id = 14, and 
>> 1000 distinct station_id), just because it's more readable than what it 
>> would be needed in raw sql....
>>
>> -- 
>>  
>>  
>>  
>>
>
>
>
> -- 
>  Paolo 
>

-- 



Reply via email to