Перечислите лучшие практики для GROUP BY & CROSS JOIN с переменными - PullRequest
0 голосов
/ 13 апреля 2020

Я пытаюсь создать этот запрос: http://sqlfiddle.com/#! 9 / 2a746d / 1 в формат Sequelize.

SELECT location, parameter, datetime, value
FROM (
   SELECT location, parameter, datetime, value,
          @seq := IF(@loc = location, @seq + 1,
                     IF(@loc := location, 1, 1)) AS seq
   FROM mytable
   CROSS JOIN (SELECT @seq := 0, @loc = '') AS vars
   ORDER By location, datetime desc, value desc) AS t
WHERE t.seq = 1   

Я пытался сделать следующее:

getLastPerCategory = function(callback) {
Model.findAll({
  attributes: [
    [sequelize.fn('MAX', sequelize.col('location')), 'location'],
    [sequelize.fn('MAX', sequelize.col('parameter')), 'parameter'],
    [sequelize.fn('MAX', sequelize.col('datetime')), 'datetime'],
    [sequelize.fn('MAX', sequelize.col('value')), 'value'],
  ],
  group: ['location'],
  raw: true,
}).then(results => callback(results));
};

Но это дает неверные значения. Моя цель - получить последний объект, сгруппированный по 'location'.

location (1,2,3,4).

Заранее спасибо, Сванте

1 Ответ

0 голосов
/ 14 апреля 2020

Не уверен, что это оптимальный способ, но я решил эту проблему, запросив ее в необработанном виде, а не в формате Sequelize.

const query = 'THE QUERY'
sequelize.query(query, 
  { 
    model: Model, mapToModel: true,
    nest: true,
    raw: true,
    type: sequelize.QueryTypes.SELECT 
  }).then(results => callback(results));
...