python - 如何从 SQLAlchemy 中的 id 池中获取每组的前 n 个结果?

标签 python postgresql sqlalchemy greatest-n-per-group

我有两张 table 。第1个代表1 article和第二个代表一个 news_cluster(对于每个集群的所有 articles_id 有一个数组列)。

我需要获得最好的 19 个 news_cluster然后为每个 news_cluster 获取 4 篇最佳文章 (按 l_score column 排序)。

目前我正在获取所有 articles_id来自全部 19 news_cluster使用 SQLAlchemy,然后我按 news_cluster 对它们进行排序和l_score使用Python:

all_news_obj = News.query.order_by(score).limit(19)
all_ids = sum([a_news.articles_id for a_news in all_news_obj], [])
all_articles = Articles.query.filter(Articles.id.in_(all_ids)).all()
articles_sorted = 4_best_l_score_sorted_by_cluster(all_articles)

我想知道是否有更快的方法来获取和排序这些文章,我发现您可以按集群 ( news_id ) 分组并获取前 4 篇文章 l_score对于使用此 psql 查询的每个:

SELECT ranked.* FROM 
(SELECT articles.*, rank() OVER (PARTITION BY news_id ORDER BY l_score DESC)
    FROM articles
    WHERE id = ANY(ARRAY[209146, 209140, 209154...])
) ranked
WHERE rank <=4

因此,如果 psql 首先处理排序可能会更快,但我不知道如何在 SQLAlchemy 中实现此查询。

最佳答案

我的问题主要在这里得到解答:Convert rank and partition query to SqlAlchemy

我只需将其调整为我的 Articles 模型,并添加一个过滤器来匹配 all_ids_array 中的 id:

subquery = db.session.query(
    Articles,
    func.rank().over(
        order_by=Articles.l_score.desc(),
        partition_by=Articles.news_id
    ).label('rank')
).filter(Articles.id.in_(all_ids_array)).subquery()

articles_sorted = db.session.query(subquery).filter(subquery.c.rank <= 4)

我是个快乐的人:这比用 python 获取所有文章然后排序快 0.1 秒。

关于python - 如何从 SQLAlchemy 中的 id 池中获取每组的前 n 个结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58333162/

相关文章:

python - Django 类 View : __init__

python - 在 for 循环中创建多个数组 (Python)

postgresql - 查找 postgres 9 中哪些行或列正在使用 TOAST(并减少 TOAST 使用)?

SQLAlchemy:如何在字段上过滤多个深层关系?

python - mysql Compress() 与 sqlalchemy

python - 如何分割包含特殊字符的字符串

python - MacOS 上的 python Datatable view() 的列名称模糊或不可见

java - 如何使用制表符格式化输出以使表格看起来清晰

java - 如何在 jsonb 列上使用 Spring JPA 进行查询?

python-3.x - sqlalchemy.exc.OperationalError : (sqlite3. OperationalError) 没有这样的表