No creo que sea posible una respuesta clara a tu pregunta. Ver #1869 :
Para responder a la pregunta del título, Sequelize generará automáticamente una subconsulta (por ejemplo, #1719 ), pero no puede hacer una subconsulta personalizada. No tengo una referencia autorizada para un negativo.
Parece que tu tabla es algo como esto:
EssayStats
EssayId
EssayDate
WordCount
Entonces podrías hacer algo como esto:
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']
});
Todo lo que está haciendo es ejecutar dos consultas SELECT, tomando el MAX y MIN de esas consultas después de ordenar por su variable de interés y luego tomando su diferencia. Eso le dará lo que le interesa:la diferencia de recuento de palabras entre la versión más reciente y la primera versión.
El truco aquí es encapsular una instrucción SELECT en un campo de atributo.
Por supuesto, es muy complicado y probablemente no sea mucho mejor que el sequelize.query
enlatado. . Pero responde a la esencia de su pregunta.
Una mejor solución podría ser desnormalizar algunos datos y almacenar "wordCountDelta" en su modelo de Ensayo directamente. Entonces podrías tener un afterCreate
gancho
para actualizar automáticamente el campo. Lo más probable es que también sea la solución más rápida.
Respondí algo similar aquí .