我试图用sqlalchemy ORM编写以下sql查询:
SELECT * FROM
(SELECT *, row_number() OVER(w)
FROM (select distinct on (grandma_id, author_id) * from contents) as c
WINDOW w AS (PARTITION BY grandma_id ORDER BY RANDOM())) AS v1
WHERE row_number <= 4;
这就是我到目前为止所做的:
s = Session()
unique_users_contents = (s.query(Content).distinct(Content.grandma_id,
Content.author_id)
.subquery())
windowed_contents = (s.query(Content,
func.row_number()
.over(partition_by=Content.grandma_id,
order_by=func.random()))
.select_from(unique_users_contents)).subquery()
contents = (s.query(Content).select_from(windowed_contents)
.filter(row_number >= 4)) ## how can I reference the row_number() value?
result = contents
for content in result:
print "%s\t%s\t%s" % (content.id, content.grandma_id,
content.author_id)
如您所见,它基本上是建模的,但我不知道如何从外部查询的位置引用子查询的row_number()
结果。我尝试了一些类似windowed_contents.c.row_number
的方法,并在window func上添加了一个label()
调用,但它不起作用,在官方文档或stackoverflow中找不到任何类似的示例。
如何才能做到这一点?另外,你能建议一个更好的方法来做这个查询吗?
windowed_contents.c.row_number
反对label()
是你的做法,对我有效(注意select_entity_from()
方法在SQLA 0.8.2中是新的,在这里需要0.9vs.select_from()
):相关问题 更多 >
编程相关推荐