14

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ウィンドウ関数の呼び出しを追加するようなことを試みlabel()ましたが、機能していません。公式ドキュメントまたはスタックオーバーフローで同様の例が見つかりませんでした。

これはどのように達成できますか?また、このクエリを実行するためのより良い方法を提案できますか?

4

1 に答える 1