我在使用炼金术,我有下面的简化模型,我用它来跟踪我一整天完成的任务.我试图实现的是计算每个记录的任务所花费的总时间,这些任务按任务id和客户端id分组.

S = TypeVar("S", bound="Tracker")

class Tracker(db.Model):

id = db.Column(Integer)
datetime_start = db.Column(DateTime)
datetime_end = db.Column(DateTime)
task_id = db.Column(Integer, ForeignKey)
client_id = db.Column(Integer, ForeignKey)

我拥有的原始SQL查询将给出我想要的结果,如下所示:

SELECT client_id , task_id, sum(difference)
FROM (
    SELECT id, 
        datetime_start, 
        datetime_end, 
        client_id, 
        task_id , 
        datetime_end-datetime_start as difference
    FROM trackers
    WHERE client_id NOTNULL
) AS s
GROUP BY task_id , client_id 
ORDER BY client_id 
Raw Data
"id","datetime_start","datetime_end","client_id","task_id"
1,2022-02-21 12:00:00.00000+0800,2022-02-21 12:30:00.00000+0800,347,3
2,2022-02-21 12:30:00.00000+0800,2022-02-21 12:50:00.00000+0800,271,4
3,2022-02-21 13:00:00.00000+0800,2022-02-21 13:20:00.00000+0800,34,1
4,2022-02-21 13:20:00.00000+0800,2022-02-21 13:30:00.00000+0800,347,1
7,2022-02-21 14:50:00.00000+0800,2022-02-21 15:40:00.00000+0800,271,4
8,2022-02-21 15:45:00.00000+0800,2022-02-21 16:45:00.00000+0800,271,6
9,2022-02-21 18:00:00.00000+0800,2022-02-21 19:30:00.00000+0800,29,3
Post-Calculation Data
"client_id","task_id","sum"
29,3,"01:30:00"
34,1,"00:20:00"
271,4,"01:10:00"
271,6,"01:00:00"
347,3,"00:30:00"
347,1,"00:10:00"

我当前的类方法查询代码如下:(灵感来源于:https://stackoverflow.com/a/33509857https://stackoverflow.com/a/27423865),但它不起作用(BaseQuery的错误是不可调用的——这导致我陷入另一个兔子洞),我怀疑这是因为我使用的是基于模型的查询,但链接中显示的示例是基于声明的.)

@classmethod
def custom_report(cls: Type[S], filters: Union[list, BooleanClauseList]):
        return cls.query((cls.datetime_end - cls.datetime_start).label("difference"))
            .filter(*filters)
            .group_by(cls.task_id, cls.client_id)
            .order_by(cls.client_id)

我知道我的自定义_报告查询是不完整的,因为它仍然不能处理聚合和函数,但在我到达那里之前,我已经陷入了我目前的困境.不过,我确实计划使用subquery()来完成剩下的部分:https://stackoverflow.com/a/38880249

Update 1:根据@snakecharmerb和@CAMILO JOSÉCRUZ RIVERA的回复,以下是有效的修订查询:

@classmethod
def custom_report(cls: Type[S], filters: Union[list, BooleanClauseList]):
    return (
        db.session.query(
            cls.task_id,
            cls.client_id,
            func.sum((cls.datetime_end - cls.datetime_start).label("difference")),
        )
        .filter(*filters)
        .group_by(cls.task_id, cls.client_id)
        .order_by(cls.client_id)
    )

推荐答案

您正试图从未查询的列中分组.

try 在查询中包含此字段

@classmethod
def custom_report(cls: Type[S], filters: Union[list, BooleanClauseList]):
        return cls.query(cls.task_id, cls.client_id, (cls.datetime_end - cls.datetime_start).label("difference"))
            .filters(*filters)
            .group_by(cls.task_id, cls.client_id)
            .order_by(cls.client_id)

Python相关问答推荐

计算相同形状的两个张量的SSE损失

即使在可见的情况下也不相互作用

删除最后一个pip安装的包

如何避免Chained when/then分配中的Mypy不兼容类型警告?

在Google Colab中设置Llama-2出现问题-加载判断点碎片时Cell-run失败

如何记录脚本输出

如何使用根据其他值相似的列从列表中获取的中间值填充空NaN数据

为什么默认情况下所有Python类都是可调用的?

对所有子图应用相同的轴格式

海上重叠直方图

当递归函数的返回值未绑定到变量时,非局部变量不更新:

调用decorator返回原始函数的输出

SQLAlchemy bindparam在mssql上失败(但在mysql上工作)

CommandeError:模块numba没有属性generated_jit''''

在matplotlib中使用不同大小的标记顶部添加批注

我对这个简单的异步者的例子有什么错误的理解吗?

如何在FastAPI中替换Pydantic的constr,以便在BaseModel之外使用?'

提取最内层嵌套链接

如何训练每一个pandaprame行的线性回归并生成斜率

VSCode Pylance假阳性(?)对ImportError的react