You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将含别名与DISTINCT子查询的SQLite语句转换为SQLAlchemy(FASTApi场景)

将SQLite查询转换为SQLAlchemy代码(FastAPI适用)

原SQL逻辑拆解

原查询核心逻辑:

  • 从prices表提取所有去重的security_id(子查询s)
  • 左连接prices表(别名p),筛选每个security_id在指定时间之前的记录
  • 按security_id分组,取每组中最新的price_datetime及对应price

完整SQLAlchemy实现代码

from sqlalchemy import select, func, distinct
from your_module import models  # 替换为实际models模块路径
from datetime import datetime

# 1. 构建去重security_id的子查询,对应原SQL中的(SELECT DISTINCT security_id FROM prices) s
subquery_s = select(distinct(models.Price.security_id)).subquery("s")

# 2. 构建主查询,实现左连接、过滤、分组逻辑
query = (
    select(
        subquery_s.c.security_id,
        models.Price.price,
        func.max(models.Price.price_datetime).label("price_datetime")
    )
    .select_from(subquery_s)
    .outerjoin(
        models.Price,
        (models.Price.security_id == subquery_s.c.security_id) &
        (models.Price.price_datetime <= datetime(2022, 8, 10, 19, 0, 0))
    )
    .group_by(subquery_s.c.security_id)
)

# FastAPI中执行查询示例(需结合数据库会话)
# result = db_session.execute(query).all()

关键细节说明

  • 子查询处理:用distinct()+subquery()实现原SQL的去重子查询,指定别名s后可通过subquery_s.c访问子查询字段
  • 左连接逻辑:outerjoin()对应原SQL的LEFT JOIN,连接条件通过&组合字段匹配和时间过滤规则
  • 字段别名:用label()给聚合函数结果指定price_datetime别名,和原SQL输出字段保持一致
  • 分组规则:按子查询的security_id分组,确保每个security_id仅返回一条最新记录

对比你的初步尝试

你的代码仅列出了查询字段,缺少子查询构建、表连接、过滤条件和分组逻辑,上述代码补充了这些核心部分,完全匹配原SQL的功能。

内容的提问来源于stack exchange,提问作者cpage

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 04:03:04