diff --git a/src/libs/middlewares/query.js b/src/libs/middlewares/query.js index ae002df2fb13727152497dc9ad61c1371d98d194..b724d93dd8e36709033eb171cceaafe9b6ff7659 100644 --- a/src/libs/middlewares/query.js +++ b/src/libs/middlewares/query.js @@ -6,6 +6,7 @@ const db = require(`${libs}/db/query_exec`); function query(req, res, next) { let sql = req.sql.toParam(); log.info(`Executando query ${req.sql.toString()}`); + sql.text = sql.text.replace(/`/g, ""); execute(sql.text, sql.values, (err, result) => { if(err) { log.error(err.stack); diff --git a/src/libs/routes/dailyChargeAmount.js b/src/libs/routes/dailyChargeAmount.js index 54ef5beabc0aa84f611acb61e3a6412285838d79..d9a02d779ad0355683769910b40780d8bac77c3d 100644 --- a/src/libs/routes/dailyChargeAmount.js +++ b/src/libs/routes/dailyChargeAmount.js @@ -284,6 +284,7 @@ rqf.addField({ table: 'turma', tableField: 'etapas_mod_ensino_segmento_id', resultField: 'education_level_mod_id', + dontGroup: true, where: { relation: '=', type: 'integer', @@ -380,7 +381,7 @@ dailyChargeAmountApp.get('/', rqf.parse(), (req, res, next) => { next(); }, id2str.transform(), response('turma')); -dailyChargeAmountApp.get('/average', rqf.parse(), (req, res, next) => { +dailyChargeAmountApp.get('/average', rqf.parse(), rqf.build(), (req, res, next) => { var status = 0; if (('education_level_mod' in req.filter || 'education_level_mod' in req.dims) && ('integral_time' in req.filter)) { @@ -401,11 +402,34 @@ dailyChargeAmountApp.get('/average', rqf.parse(), (req, res, next) => { } if (status) { - req.sql.from('turma') + let baseQ = req.sql.clone(); + + let tableR = baseQ.clone(); + tableR.from('turma') + .field('duracao_turma') + .field('ROW_NUMBER() OVER(PARTITION BY etapas_mod_ensino_segmento_id ORDER BY duracao_turma)', 'rowno') + .where('tipo_turma_id <= 3') + + let tableG = baseQ.clone(); + tableG.from('turma') + .field('1+COUNT(*)', 'counter') + .where('tipo_turma_id <= 3') + .group('etapas_mod_ensino_segmento_id') + + let joinRG = squel.select(); + joinRG.from(tableR, 'R') + .field('R.education_level_mod_id') + .field('AVG(1.0*R.duracao_turma)/60', 'median_value') + .join(tableG, 'G', 'R.education_level_mod_id = G.education_level_mod_id AND R.rowNo BETWEEN G.counter/2 AND G.counter/2+G.counter%2') + .group('R.education_level_mod_id') + + req.sql + .from('turma') + .from(joinRG, 'm') .field('turma.ano_censo', 'year') .field('turma.etapas_mod_ensino_segmento_id', 'education_level_mod_id') .field('AVG(turma.duracao_turma)/60.0', 'average_class_duration') - .field('MEDIAN(turma.duracao_turma)/60.0', 'median_class_duration') + .field('AVG(m.median_value)', 'median_class_duration') .field('STDDEV_SAMP(turma.duracao_turma)/60.0', 'std_class_duration') .field('QUANTILE(turma.duracao_turma, 0.25)/60.0', 'fstqt_class_duration') .field('QUANTILE(turma.duracao_turma, 0.75)/60.0', 'thdqt_class_duration') @@ -413,7 +437,7 @@ dailyChargeAmountApp.get('/average', rqf.parse(), (req, res, next) => { .group('turma.etapas_mod_ensino_segmento_id') .order('turma.ano_censo') .order('turma.etapas_mod_ensino_segmento_id') - .where('turma.tipo_turma_id <= 3') + .where('turma.tipo_turma_id <= 3 and m.education_level_mod_id = turma.etapas_mod_ensino_segmento_id') } else { res.status(400); next({ @@ -423,6 +447,6 @@ dailyChargeAmountApp.get('/average', rqf.parse(), (req, res, next) => { } next(); -}, rqf.build(), query, addMissing(rqf), id2str.transform(), response('turma')); +}, query, addMissing(rqf), id2str.transform(), response('turma')); module.exports = dailyChargeAmountApp;