Skip to content

Instantly share code, notes, and snippets.

@CoutinhoElias
Last active September 18, 2023 09:12
Show Gist options
  • Save CoutinhoElias/118ec28f8a6ff4e9a14c02c0ef2363ff to your computer and use it in GitHub Desktop.
Save CoutinhoElias/118ec28f8a6ff4e9a14c02c0ef2363ff to your computer and use it in GitHub Desktop.
Subquery on peewee
# When referencing a table multiple times, we'll call Model.alias() to create
# a secondary reference to the table.
EstoqueAlias = Estoque.alias()
# Create a subquery that will calculate the maximum Post timestamp for each
# user.
subquery = (EstoqueAlias
.select(
EstoqueAlias.iddetalhe,
fn.MAX(EstoqueAlias.dtreferencia).alias('max_ts'))
.group_by(EstoqueAlias.iddetalhe)
.alias('post_max_subquery'))
# Query for posts and join using the subquery to match the post's user
# and timestamp.
query = (Estoque
.select(
Detalhe.cdprincipal,
Detalhe.dsdetalhe,
Produto.stativo,
Grupo.nmgrupo,
Familia.dsfamilia,
Detalhe.vlprecocusto,
Detalhe.vlprecovenda,
Unidade.dsunidade,
Pessoas.nmpessoa,
Detalhe.iddetalhe,
Estoque.qtestoque2,
Estoque.qtestoque,
Estoque.iddetalhe,
)
.join(Detalhe, on=Estoque.iddetalhe == Detalhe.iddetalhe). \
join(Produto, on=(Detalhe.idproduto == Produto.idproduto)). \
join(Familia, on=(Detalhe.idfamilia == Familia.idfamilia)). \
join(Grupo, on=(Produto.idgrupo == Grupo.idgrupo)). \
join(Unidade, on=(Produto.idunidade == Unidade.idunidade)). \
join(Pessoas, on=(Produto.idfornecprincipal == Pessoas.idpessoa))
.switch(Estoque)
.join(subquery, on=(
(Estoque.dtreferencia == subquery.c.max_ts) &
(Estoque.iddetalhe == subquery.c.iddetalhe))))
print('****', query)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment