If I understand correctly the problem it's a matter of using windowing 
functions, that are not available on all db engines and far too complicated 
to expose a consistent api by the DAL.
Picking out "the first match only" doesn't quite explain what you need in 
detail (maybe it can be worked out without windowing functions in a 
particular case).... can you please make an example of "real data" to start 
with and what you want the resultset to return ?

On Monday, January 7, 2013 7:46:17 PM UTC+1, Paolo valleri wrote:
>
> Hi Niphlod, yes it solved the problem. 
> Now I have an other problem, I need to make a self left join, but limited 
> to 1 match only. Namely, I've just need to make the join only for the first 
> matching row.  I've tried something like:
>         rows = db( query ).select(start.gathered_on,start.mac,start.id,
>                    end.gathered_on, end.mac, end.id,
>                    start.gathered_on.epoch(),
>                    end.gathered_on.epoch(),
>                    orderby=start.gathered_on.epoch(),
>                    left= start.on(start.mac == end.mac),
>                    groupby=start.id,
>                    cacheable = True)
> This actually works on sqlite but on postgres failed because on postgres 
> you can group only onto the field expressed in the select. Moreover, even 
> if on sqlite it works, It select the wrong rows. 
> Online I have found this post: 
> http://archives.postgresql.org/pgsql-novice/2011-01/msg00069.php
> and now I am trying to understand how to define a sub_select with the 
> limitby=1 to carry out the left join.
>
> Any idea ?
> Regards,
> Paolo
>
>
>
>
> On Monday, January 7, 2013 2:21:33 PM UTC+1, Niphlod wrote:
>>
>> did you try changing "start" and "end" as aliases ? 
>> while "start" on postgresql isn't reserved ( but is a reserved keyword 
>> for t-sql:2003 and t-sql:1999), "end" is reserved even for postgresql.
>>
>> On Monday, January 7, 2013 1:21:27 PM UTC+1, Paolo valleri wrote:
>>>
>>> Hi all, I've problems on defining self join queries on postgres, the 
>>> query, works on sqlite, is defined as follows:
>>>
>>> start = db.record.with_alias('start')
>>> end = db.record.with_alias('end')
>>> query = ((start.station_id == 11) &
>>>          (end.station_id == 12))
>>> rows = db( query ).select(start.gathered_on,start.mac, end.gathered_on, 
>>> end.mac,
>>>                          orderby=start.gathered_on.epoch(),
>>>                          left= start.on( (start.mac == end.mac) ))
>>> The table is:
>>> db.define_table('record',
>>>     Field('station_id', 'reference station'),
>>>     Field('log_id', 'reference log'),
>>>     Field('mac'),
>>>     Field('gathered_on', 'datetime'),
>>> )
>>>
>>> The generated query is:
>>> SELECT  start.gathered_on, start.mac, end.gathered_on, end.mac 
>>> FROM record AS end 
>>> LEFT JOIN record AS start ON (start.mac = end.mac) WHERE ((start.station_id 
>>> = 11) AND (end.station_id = 12)) 
>>> ORDER BY EXTRACT(epoch FROM start.gathered_on);
>>>
>>> and it fails raising the following error:
>>>
>>> Traceback (most recent call last):
>>>   File "/home/paolo/Dropbox/git/web2py/gluon/restricted.py", line 212, in 
>>> restricted
>>>     exec ccode in environment
>>>   File 
>>> "/home/paolo/Dropbox/git/web2py/applications/vtraffic/controllers/default.py"
>>>  
>>> <http://127.0.0.1:8000/admin/default/edit/vtraffic/controllers/default.py>, 
>>> line 655, in <module>
>>>   File "/home/paolo/Dropbox/git/web2py/gluon/globals.py", line 193, in 
>>> <lambda>
>>>     self._caller = lambda f: f()
>>>   File 
>>> "/home/paolo/Dropbox/git/web2py/applications/vtraffic/controllers/default.py"
>>>  
>>> <http://127.0.0.1:8000/admin/default/edit/vtraffic/controllers/default.py>, 
>>> line 37, in index
>>>     left= start.on( (start.mac == end.mac) ))
>>>   File "/home/paolo/Dropbox/git/web2py/gluon/dal.py", line 8966, in select
>>>     return adapter.select(self.query,fields,attributes)
>>>   File "/home/paolo/Dropbox/git/web2py/gluon/dal.py", line 1636, in select
>>>     return self._select_aux(sql,fields,attributes)
>>>   File "/home/paolo/Dropbox/git/web2py/gluon/dal.py", line 1601, in 
>>> _select_aux
>>>     self.execute(sql)
>>>   File "/home/paolo/Dropbox/git/web2py/gluon/dal.py", line 1714, in execute
>>>     return self.log_execute(*a, **b)
>>>   File "/home/paolo/Dropbox/git/web2py/gluon/dal.py", line 1708, in 
>>> log_execute
>>>     ret = self.cursor.execute(*a, **b)
>>> ProgrammingError: syntax error at or near "end"
>>> LINE 1: SELECT  start.gathered_on, start.mac, end.gathered_on, end.m...
>>>
>>>
>>> What should I have to do?
>>> Regards,
>>> Paolo
>>>
>>

-- 



Reply via email to