That's it, awesome! Thank you!

>>> q2 = s.query(q1).order_by(q1.c.lastname, q1.c.firstname)


>> Sorry to tag on a followup, but how would I get the following relationship 
>> mapped onto the 2nd, non-distinct SELECT ("q2" above)? From the "Appl" class 
>> below:
>> 
>>>> city         = relationship('City', lazy='joined', 
>>>> primaryjoin='City.id==Appl.cityid')
>> 
>> I tried some aliased join variations but couldn't get anything to work. I 
>> think there's some additional configuration needed as I have two columns 
>> (cityid and cityid2) in table Appl that reference the City table.

Thanks again for all your help!


On Sep 19, 2013, at 12:33 PM, Michael Bayer <[email protected]> wrote:

> OK, like this then:
> 
> q1 = s.query(Appl).distinct(Appl.refid).\
>           filter(Appl.lastname.ilike('Williamson%')).\
>           filter(Appl.firstname.ilike('d%')).\
>           group_by(Appl).\
>           order_by(Appl.refid, Appl.appldate.desc())
> 
> 
> 
> output:
> 
> WITH distinct_query AS 
> (SELECT DISTINCT ON (appl.refid) appl.id AS id, appl.firstname AS firstname, 
> appl.lastname AS lastname, appl.refid AS refid, appl.appldate AS appldate 
> FROM appl 
> WHERE appl.lastname ILIKE %(lastname_1)s AND appl.firstname ILIKE 
> %(firstname_1)s GROUP BY appl.id, appl.firstname, appl.lastname, appl.refid, 
> appl.appldate ORDER BY appl.refid, appl.appldate DESC)
> SELECT distinct_query.id AS distinct_query_id, distinct_query.firstname AS 
> distinct_query_firstname, distinct_query.lastname AS distinct_query_lastname, 
> distinct_query.refid AS distinct_query_refid, distinct_query.appldate AS 
> distinct_query_appldate 
> FROM distinct_query ORDER BY distinct_query.lastname, distinct_query.firstname
> 
> 
> I know this is not exactly the same, but the query itself is a SELECT 
> DISTINCT ON(x), which seems to be what they're getting at when I look at 
> http://www.postgresql.org/docs/9.0/static/sql-select.html#SQL-DISTINCT.
> 
> 
> 
> 
> On Sep 18, 2013, at 5:39 PM, Nathan Mailg <[email protected]> wrote:
> 
>> Thanks Mike for all the help! I think we're really close.
>> 
>> Unfortunately, the "DISTINCT ON (refid) *" syntax appears to be needed, as 
>> opposed to "DISTINCT (refid), *", since the following query in psql is not 
>> filtering the duplicate refid's:
>> 
>> WITH distinct_query AS (SELECT DISTINCT (refid), *
>>   FROM appl
>>   WHERE lastname ILIKE 'Williamson%' AND firstname ILIKE 'd%'
>>   GROUP BY refid, id, lastname, firstname, appldate
>>   ORDER BY refid, appldate DESC
>> )
>> SELECT * from distinct_query ORDER BY lastname, firstname;
>> 
>> and the above is what appears to be the equivalent of:
>> 
>>> q1 = s.query(distinct(Appl.refid), Appl).\
>>>          filter(Appl.lastname.ilike('Williamson%')).\
>>>          filter(Appl.firstname.ilike('d%')).\
>>>          group_by(Appl).\
>>>          order_by(Appl.refid, Appl.appldate.desc())
>>> q1 = q1.cte('distinct_query')
>>> q2 = s.query(q1).order_by(q1.c.lastname, q1.c.firstname)
>> 
>> 
>> I got the above code running with no exceptions, so that's great, but it's 
>> not getting rid of rows with the same refid in "distinct_query". Is there a 
>> way I can get "DISTINCT ON (refid) *" generated?
>> 
>> Sorry to tag on a followup, but how would I get the following relationship 
>> mapped onto the 2nd, non-distinct SELECT ("q2" above)? From the "Appl" class 
>> below:
>> 
>>>> city         = relationship('City', lazy='joined', 
>>>> primaryjoin='City.id==Appl.cityid')
>> 
>> 
>> I tried some aliased join variations but couldn't get anything to work. I 
>> think there's some additional configuration needed as I have two columns 
>> (cityid and cityid2) in table Appl that reference the City table.
>> 
>> I really appreciate all your help!
>> 
>> 
>> On Sep 17, 2013, at 10:51 PM, Michael Bayer <[email protected]> wrote:
>> 
>>> here's a proof of concept which completes in postgresql for me:
>>> 
>>> […]
>>> 
>>> q1 = s.query(distinct(Appl.refid), Appl).\
>>>          filter(Appl.lastname.ilike('Williamson%')).\
>>>          filter(Appl.firstname.ilike('d%')).\
>>>          group_by(Appl).\
>>>          order_by(Appl.refid, Appl.appldate.desc())
>>> 
>>> q1 = q1.cte('distinct_query')
>>> q2 = s.query(q1).order_by(q1.c.lastname, q1.c.firstname)
>>> q2.all()
>>> 
>>> query outputs as:
>>> 
>>> WITH distinct_query AS 
>>> (SELECT DISTINCT appl.refid AS anon_1, appl.id AS id, appl.firstname AS 
>>> firstname, appl.lastname AS lastname, appl.refid AS refid, appl.appldate AS 
>>> appldate 
>>> FROM appl 
>>> WHERE appl.lastname ILIKE %(lastname_1)s AND appl.firstname ILIKE 
>>> %(firstname_1)s GROUP BY appl.id, appl.firstname, appl.lastname, 
>>> appl.refid, appl.appldate ORDER BY appl.refid, appl.appldate DESC)
>>> SELECT distinct_query.anon_1 AS distinct_query_anon_1, distinct_query.id AS 
>>> distinct_query_id, distinct_query.firstname AS distinct_query_firstname, 
>>> distinct_query.lastname AS distinct_query_lastname, distinct_query.refid AS 
>>> distinct_query_refid, distinct_query.appldate AS distinct_query_appldate 
>>> FROM distinct_query ORDER BY distinct_query.lastname, 
>>> distinct_query.firstname
>>> 
>>> turning it into aliased(), while unnecessary, works also:
>>> 
>>> q1 = q1.cte('distinct_query')
>>> q1 = aliased(q1, 'd_q_a')
>>> q2 = s.query(q1).order_by(q1.c.lastname, q1.c.firstname)
>>> q2.all()
>>> 
>>> 
>>> On Sep 17, 2013, at 6:39 PM, Nathan Mailg <[email protected]> wrote:
>>> 
>>>> I'm using SA 0.8.2 and trying to port this query that works with 
>>>> PostgreSQL 9.2.4:
>>>> 
>>>> WITH distinct_query AS (
>>>> SELECT DISTINCT ON (refid) *
>>>>     FROM appl
>>>>     WHERE lastname ILIKE 'Williamson%' AND firstname ILIKE 'd%'
>>>>     GROUP BY refid, id, lastname, firstname, appldate
>>>>     ORDER BY refid, appldate DESC
>>>> )
>>>> SELECT * FROM distinct_query ORDER BY lastname, firstname;
>>>> 
>>>> I've worked on this quite a while and I'm stuck. I've tried every 
>>>> construct in the docs that looks like it might work without success 
>>>> (subquery, join, select, etc). Here's what I've been referencing most 
>>>> recently that I think is the closest to what I want:
>>>> 
>>>> http://docs.sqlalchemy.org/en/rel_0_8/orm/query.html?highlight=cte#sqlalchemy.orm.query.Query.cte
>>>> 
>>>> […]
>>>> 
>>>> class Appl(Base):
>>>> __tablename__ = 'appl'
>>>> id          = Column(Integer, primary_key=True)
>>>> refid       = Column(Integer, Sequence('appl_refid_seq'))
>>>> appldate    = Column(Date)
>>>> lastname    = Column(Unicode(50))
>>>> firstname   = Column(Unicode(50))
>>>> middlename  = Column(Unicode(50))
>>>> cityid      = Column(Integer, ForeignKey('city.id'))
>>>> cityid2     = Column(Integer, ForeignKey('city.id'))
>>>> raceid      = Column(Integer, ForeignKey('race.id'))
>>>> maritalid   = Column(Integer, ForeignKey('marital.id'))
>>>> #
>>>> city         = relationship('City', lazy='joined', 
>>>> primaryjoin='City.id==Appl.cityid')
>>>> city2        = relationship('City', lazy='joined', 
>>>> primaryjoin='City.id==Appl.cityid2')
>>>> race         = relationship('Race', lazy='joined')
>>>> marital      = relationship('Marital', lazy='joined')
>>>> applrefs     = relationship('ApplReferrer', cascade="all, delete, 
>>>> delete-orphan",
>>>>                             lazy='joined', order_by='ApplReferrer.id')
>>>> applsponsors = relationship('ApplSponsor', backref='appl', cascade="all, 
>>>> delete, delete-orphan",
>>>>                             lazy='joined', order_by='ApplSponsor.id')
>>>> applbenefs   = relationship('ApplBenef', cascade="all, delete, 
>>>> delete-orphan",
>>>>                             lazy='joined', order_by='ApplBenef.id')
>>>> 
>>>> Please let me know if you need more info. Thanks!

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to