Je ne pense pas qu'une réponse claire à votre question soit possible. Voir #1869 :
Pour répondre à la question du titre, Sequelize générera automatiquement une sous-requête (par exemple, #1719 ), mais vous ne pouvez pas créer de sous-requête personnalisée. Je n'ai pas de référence faisant autorité pour un négatif.
Il semble que votre tableau ressemble à ceci :
EssayStats
EssayId
EssayDate
WordCount
Ensuite, vous pourriez faire quelque chose comme ceci :
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']
});
Tout ce qu'il fait est d'exécuter deux requêtes SELECT, en prenant le MAX et le MIN de ces requêtes après avoir trié par votre variable d'intérêt, puis en prenant votre différence. Cela vous donnera ce qui vous intéresse :la différence de nombre de mots entre la version la plus récente et la première version.
L'astuce consiste ici à encapsuler une instruction SELECT dans un champ d'attribut.
Bien sûr, c'est désordonné et probablement pas beaucoup mieux que le sequelize.query
en conserve . Mais cela répond à l'essentiel de votre question.
Une meilleure solution pourrait être de dénormaliser certaines de vos données et de stocker directement "wordCountDelta" dans votre modèle Essay. Ensuite, vous pourriez avoir un afterCreate
hook
pour mettre à jour automatiquement le champ. Ce serait probablement aussi la solution la plus rapide.
J'ai répondu quelque chose de similaire ici .