Hi Mike, 
that looks very good, 

However, I am still left with three problems:

a) the query returns "None" in the datediff column. It seems that the 
strings "datetime" and "PreviousDate" are somehow not recognized. When I 
replace 
        "( 
            func.julianday("datetime") - 
            func.julianday("PreviousDate")).label("datediff") "
by 
        (max_subq).label("datediff") 

then I do get a non-None result. The constructed SQL is:
SELECT "T".id, "T".datetime, "T".val, "T".info, (SELECT max("T2".datetime) 
AS max_1 
  FROM "testTable" AS "T2", "testTable" AS "T1" 
  WHERE "T2".info = "T1".info AND "T2".datetime < "T1".datetime) AS 
datediff 
  FROM (SELECT "T1".id AS id, "T1".datetime AS datetime, "T1".val AS val, 
"T1".info AS info, (SELECT max("T2".datetime) AS max_1 
  FROM "testTable" AS "T2" 
  WHERE "T2".info = "T1".info AND "T2".datetime < "T1".datetime) AS 
"PreviousDate" 
  FROM "testTable" AS "T1") AS "T"

The "datediff" column contains, in this case, the value "2018-01-03" in 
each of the 6 rows.

b) I do not know what the "correlate(T1)" statement does. I looked up the 
docs for correlate but was unable to find out what that really does. 
The SQL produced by your code is identical regardless of whether 
correlate(T1) is used or not.

c) The code is still sqlite-specific (use of julianday()). Suppose I find 
out the  reason why the code does not work and succeed reproducing the 
desired output. Then the code would still be SQLite-specific and not 
generic which is the main reason for using sqlalchemy. What do I have to do 
to make it databse-backend-indpeendent?

Thanks for your help, 
Bjoern

 

> no need, can you try this query? 
>
>     T2 = aliased(CTestTable, name="T2") 
>     T1 = aliased(CTestTable, name="T1") 
>
>     max_subq = session.query( 
>         func.max(T2.datetime) 
>     ).filter(T2.info == T1.info).filter( 
>         T2.datetime < T1.datetime).correlate(T1).label("PreviousDate") 
>
>     subq = session.query( 
>         T1.id, T1.datetime, T1.val, T1.info, max_subq).subquery("T") 
>     q = session.query( 
>         subq.c.id, subq.c.datetime, subq.c.val, subq.c.info, 
>         ( 
>             func.julianday("datetime") - 
>             func.julianday("PreviousDate")).label("datediff") 
>     ).select_from( 
>         subq 
>     ) 
>
>     q.all() 
>
> log output is: 
>
> SELECT "T".id AS "T_id", "T".datetime AS "T_datetime", "T".val AS 
> "T_val", "T".info AS "T_info", julianday(?) - julianday(?) AS datediff 
> FROM (SELECT "T1".id AS id, "T1".datetime AS datetime, "T1".val AS 
> val, "T1".info AS info, (SELECT max("T2".datetime) AS max_1 
> FROM "testTable" AS "T2" 
> WHERE "T2".info = "T1".info AND "T2".datetime < "T1".datetime) AS 
> "PreviousDate" 
> FROM "testTable" AS "T1") AS "T" 
> 2018-05-03 20:11:30,082 INFO sqlalchemy.engine.base.Engine 
> ('datetime', 'PreviousDate') 
>
>
> is that right?  note the uppercase names need to be quoted, literal 
> values are turned into bind parameters, etc. 
>
>
>

-- 
SQLAlchemy - 
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable 
Example.  See  http://stackoverflow.com/help/mcve for a full description.
--- 
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 sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to