使用SQLAlchemy连接两个子查询时出现意外结果

使用SQLAlchemy连接两个子查询时出现意外结果,sqlalchemy,Sqlalchemy,我有一个很大的SQL表,如下所示 Id Firstname Lastname tran_id insert_datetime ============================================================== 1 Tom Smith 0 2020-08-07 15:37:32 2 Tom

我有一个很大的SQL表,如下所示

Id       Firstname       Lastname        tran_id      insert_datetime
==============================================================
1           Tom              Smith             0         2020-08-07 15:37:32
2           Tom              Smith             0         2020-08-06 06:33:44
3           Tom              Smith             1         2020-08-07 12:43:53
4           Foo               Bar              7         2020-08-24 23:43:21
5           Foo               Bar              0         2020-08-25 14:23:24
....
我试着按firstname、lastname、date对它进行分组,并获得除tran_id=0之外的事务数,如下所示:

Firstname       Lastname        date          num_tran
==============================================================
Tom              Smith         2020-08-25         0         
Tom              Smith         2020-08-26         2         
Foo               Bar          2020-08-25         1        
Foo               Bar          2020-08-26         0        
....
我通过以下操作在MySQL中实现了这一点:

SELECT a.firstname, a.lastname, a.date,
CASE
    WHEN b.num_tran IS NOT NULL THEN b.num_tran
    ELSE 0
END AS num_tran
FROM 
(SELECT firstname, lastname, DATE(insert_datetime) AS date
FROM table
WHERE a.insert_datetime >= '2020-08-25' AND a.insert_datetime <= ' 2020-08-27'
GROUP BY firstname, lastname, date
) a
LEFT OUTER JOIN
(SELECT firstname, lastname, DATE(insert_datetime) AS date, COUNT(Id) AS num_tran
FROM table
WHERE tran_id != 0 AND a.insert_datetime >= '2020-08-25' AND a.insert_datetime <= ' 2020-08-27'
GROUP BY firstname, lastname, date
) b
ON a.firstname = b.firstname, a.lastname = b.lastname, a.date = b.date
我尝试将其转换为SQLAlchemy,如下所示:

from sqlalchemy import func, case, cast, Date
from sqlalchemy.sql import label

# First full table subquery
full_table = (
    request.dbsession.query(
        table.firstname,
        table.lastname,
        label('date', cast(table.insert_datetime, Date))
    )
    .filter(
        table.insert_datetime >= '2020-08-25',
        table_insert_datetime <= '2020-08-27')
    .group_by(
        table.firstname,
        table.lastname,
        cast(table.insert_datetime, Date))
    .subquery()
)

# Second subquery
num_transactions = (
    request.dbsession.query(
        table.firstname,
        table.lastname,
        label('date', cast(table.insert_datetime, Date)
        label('num_tran', func.count(table.id))
    )
    .filter(
        table.tran_id != 0,
        table.insert_datetime >= '2020-08-25',
        table.insert_datetime <= '2020-08-27')
    .group_by(
        table.firstname,
        table.lastname,
        cast(table.insert_datetime, Date))
    .subquery()
)

# Left outer join to get final table
result_table = (
    request.dbsession.query(
        full_table.c.firstname,
        full_table.c.lastname,
        full_table.c.date,
        case(
            [(num_transactions.c.num_tran == None, 0)],
            else_=num_transaction.c.num_tran)
        .label('num_tran'))
    .join(num_transactions,
          (full_table.c.firstname == num_transaction.c.firstname) &
          (full_table.c.lastname == num_transaction.c.lastname) &
          (full_table.c.date == num_transaction.c.date), 
          isouter=True)
)

但是,我得到了数以万计的结果,显然与MySQL中的查询结果不匹配。在使用SQLAlchemy编写查询的过程中是否有什么地方出了问题?

在关于查询的表\u insert\u datetime中,如果要在计数时跳过0,可以利用计数不计数为NULL的事实:选择firstname、lastname、DATEinsert\u datetime作为日期、COUNTNULLIFtran\u id,0作为num_tran,其中insert_datetime在'2020-08-25'和'2020-08-27'之间,按firstname、lastname、date分组。在表中insert_datetime关于查询,如果要在计数时跳过0,可以利用计数不计数为NULL的事实:选择firstname、lastname、DATEinsert_datetime作为日期,COUNTNULLIFtran\u id,0作为num_tran,其中按名字、姓氏和日期插入'2020-08-25'和'2020-08-27'组之间的日期时间