使用SQLAlchemy连接两个子查询时出现意外结果
我有一个很大的SQL表,如下所示使用SQLAlchemy连接两个子查询时出现意外结果,sqlalchemy,Sqlalchemy,我有一个很大的SQL表,如下所示 Id Firstname Lastname tran_id insert_datetime ============================================================== 1 Tom Smith 0 2020-08-07 15:37:32 2 Tom
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'组之间的日期时间