Eu não acho que uma resposta clara à sua pergunta seja possível. Consulte #1869 :
Para responder à pergunta do título, o Sequelize gerará automaticamente uma subconsulta (por exemplo, #1719 ), mas você não pode fazer uma subconsulta personalizada. Eu não tenho uma referência oficial para um negativo.
Parece que sua tabela é algo assim:
EssayStats
EssayId
EssayDate
WordCount
Então você poderia fazer algo assim:
return EssayStat.findAll({
attributes: [
[sequelize.literal('((SELECT wordCount FROM "EssayStats" WHERE "EssayId" = "EssayStat"."EssayId" EssayStat BY "createdAt" DESC LIMIT 1) - (SELECT wordCount FROM "EssayStats" WHERE "EssayId" = "EssayStat"."EssayId" EssayStat BY "createdAt" ASC LIMIT 1))'), 'difference'],
'EssayId'
],
group: ['EssayId']
});
Tudo o que ele está fazendo é executar duas consultas SELECT, pegando o MAX e o MIN dessas consultas depois de ordenar por sua variável de interesse e, em seguida, tirar sua diferença. Isso lhe dará o que você está interessado:a diferença de contagem de palavras entre a versão mais recente e a primeira versão.
O truque aqui é encapsular uma instrução SELECT em um campo de atributo.
Claro, é confuso pra caramba e provavelmente não é muito melhor do que o
sequelize.query
enlatado . Mas responde à essência da sua pergunta. Uma solução melhor pode ser desnormalizar alguns dados e armazenar "wordCountDelta" diretamente no seu modelo Essay. Então você poderia ter um
afterCreate
gancho
para atualizar automaticamente o campo. Essa provavelmente seria a solução mais rápida também. Eu respondi algo semelhante aqui .