gpt4 book ai didi

python - 使用SQLAlchemy,如何查询每天的第一条记录

转载 作者:行者123 更新时间:2023-12-01 09:25:32 25 4
gpt4 key购买 nike

我将使用This page处的表结构

class Book(Base):  
__tablename__ = "books"
id = Column(Integer,Sequence('book_seq'),primary_key=True)
name = Column(String(50))
time_added = Column(DateTime, default=datetime.datetime.now)

比如说,我已将这些书添加到表中:

  1. 第一天,1:00
  2. 第一天 2:00
  3. 第 2 天,1:00
  4. 第 2 天,2:00
  5. 第二天 3:00

如何进行查询来过滤掉记录当天添加的第一本书的第 1 行和第 3 行?

我已经尝试过

Book.query.order_by(Book.date_added).\
group_by(db.func.date(Book.date_added, "start of day"))

但它实际上给出了每天的最后结果,这是错误的。现在我不知道我能做什么,因为 sqlalchemy 的文档和示例非常有限。

请帮我找出问题所在,或者告诉我正确的查询语句,非常感谢。

编辑:
感谢您的澄清建议。

我使用的数据库后端是sqlite

对于问题的输入和输出:
books 包含在不同日期的不同时间添加的许多书籍(不同的 time_added)。我想过滤那些日子里最先插入的书籍。以天为组,选择组中添加时间最早的书。

最佳答案

这是 SQL 中比较常见的问题,有自己的标签: 。在你的例子中N = 1,这使得它在 SQLite 中更加简单。一种解决方案是使用反连接,或者换句话说,选择不存在具有较小时间戳的行的行。这可以使用左连接来实现:

book_alias = aliased(Book)
Book.query.\
outerjoin(
book_alias,
and_(func.date(Book.time_added) == func.date(book_alias.time_added),
Book.time_added > book_alias.time_added)).\
filter(book_alias.id == None).\
all()

同样的事情,使用 EXISTS 子查询表达式:

Book.query.\
filter(not_(db.session.query(book_alias).
filter(book_alias.time_added < Book.time_added,
func.date(book_alias.time_added) ==
func.date(Book.time_added)).
exists())).\
all()

当然,您也可以使用子查询来查找组中的最小值,并据此进行过滤:

sq = db.session.query(func.min(book_alias.time_added)).\
filter(func.date(book_alias.time_added) == func.date(Book.time_added))

Book.query.\
filter(Book.time_added == sq).\
all()

查询的执行效果可能会有所不同,具体取决于您的数据,因此请测试最适合您的查询。

关于python - 使用SQLAlchemy,如何查询每天的第一条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50434115/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com