简体   繁体   中英

SQLAlchemy counting subquery result

I have an SQL query which I want to convert to use the ORM but I cannot get the ORM to count the results from the subquery. So my working SQL is:

select FOO
       ,BAR
       ,TOTALCOUNT
from(
select FOO
      ,BAR
      ,COUNT(BAR) OVER (PARTITION BY FOO) AS TOTALCOUNT
from(
SELECT distinct
      [FOO]
      ,[BAR]
  FROM [database].[dbo].[table]
)m
    )m
WHERE TOTALCOUNT > 10

I have tried to create the equivalent code using the ORM but my final result has just 1's for the final count, the code I have tried is below

    subs = session.query(table.FOO,table.BAR).filter(
                            table.date > datetime.now() - timedelta(days=10),
                        ).distinct().subquery()


   result = pd.read_sql(session.query(subs.c.FOO,subs.c.BAR,func.count(subs.c.BAR).label('TOTALCOUNT')).group_by(subs.c.FOO,subs.c.BAR).statement,session.bind)

I have also tried to do it in one query with:

result = pd.read_sql(session.query(table.FOO,table.BAR,func.count(table.BAR).label("TOTALCOUNT")).filter(
                and_(
                    table.date> datetime.now() - timedelta(days= 30),
                    )
                ),groupby.order_by(table.FOO).distinct().statement,session.bind)

But that is counting the columns before applying the distinct operator so the count is incorrect. I would really appreciate if someone could assist me or tell me where I am going wrong, I have googled all morning and cant seem to find an answer.

ahh im an idiot, should pay more attention to what I am doing, added the alias and then removed an additional column i was grouping by. However should anyone else ever struggle with something similar here is the working code.

subs = session.query(table.FOO,table.BAR).filter(
                        table.date > datetime.now() - timedelta(days=10),
                     ).distinct().subquery().alias('subs')


result = pd.read_sql(session.query(subs.c.FOO,func.count(subs.c.BAR).label('TOTALCOUNT'))./
    group_by(subs.c.FOO).statement,session.bind)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM