我有两张桌子。第一个代表article
每行一个,第二个代表news_cluster
每行一个(每个簇都包含一个数组列)。articles_id
我需要获得19最好news_cluster
再拿到4篇最好的文章对每个news_cluster
(按顺序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中实现此查询。
我的问题主要在这里得到回答:将等级和分区查询转换为SqlAlchemy
我只需要使其适应我的Articles
模型,并添加一个过滤器以匹配其中的ID all_ids_array
:
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秒。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句