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

需求:
查询数据去除数据项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 最大的记录。

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

猜你喜欢

转载自blog.csdn.net/qq_41604569/article/details/130322011