【python】sqlachemy 查询数据去除数据项name 中重复项,保留id较大的一个

113 篇文章 15 订阅
8 篇文章 0 订阅

需求:
查询数据去除数据项name 中重复项,保留id较大的一个
解决:
在 SQLAlchemy 中,您可以使用 distinct 函数和 group_by 方法来查询去除重复项的数据。同时,您可以使用 func.max 函数来获取最大的 id 值。以下是一个示例代码:

from sqlalchemy import create_engine, Column, Integer, String, func
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

engine = create_engine('your_database_url')
Session = sessionmaker(bind=engine)
Base = declarative_base()

class Record(Base):
    __tablename__ = 'your_table_name'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    # 其他列定义

session = Session()

# 查询去除重复项后,id 值最大的记录
subquery = session.query(func.max(Record.id).label('max_id'), Record.name).group_by(Record.name).subquery()
records = session.query(Record).join(subquery, Record.id == subquery.c.max_id).all()

在上面的代码中,我们首先定义了一个名为 Record 的 SQLAlchemy 模型,其对应了您的表格结构。然后,我们创建了一个会话对象并使用 func.max 函数和 group_by 方法创建了一个子查询,以获取每个不同 name 值对应的最大 id 值。最后,我们使用 join 方法将子查询与 Record 表格进行连接,并使用 all 方法获取所有查询结果。

请注意,这个查询有一个假设,即 id 值越大的记录在时间上越晚。如果您的数据不符合这个假设,您可能需要使用其他的方法来选择要保留的记录。

如果您不能假设 id 值越大的记录在时间上越晚,您可以使用以下方法来选择要保留的记录:

from sqlalchemy import create_engine, Column, Integer, String, func, desc
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

engine = create_engine('your_database_url')
Session = sessionmaker(bind=engine)
Base = declarative_base()

class Record(Base):
    __tablename__ = 'your_table_name'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    # 其他列定义

session = Session()

# 查询去除重复项后,保留 id 最大的记录
subquery = session.query(func.max(Record.id).label('max_id')).group_by(Record.name).subquery()
records = session.query(Record).filter(Record.id.in_(subquery)).order_by(desc(Record.id)).all()

在上面的代码中,我们使用 func.max 函数和 group_by 方法创建了一个子查询,以获取每个不同 name 值对应的最大 id 值。然后,我们使用 Record.id.in_(subquery) 条件过滤器来选择所有 id 值在子查询中的记录。最后,我们使用 order_by(desc(Record.id)) 来将记录按照 id 值降序排列,以保留 id 最大的记录。

请注意,这个查询可能会比较慢,因为它需要使用子查询来选择要保留的记录。如果您的数据量很大,您可能需要考虑使用其他方法来优化查询性能。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魔都吴所谓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值