MySQL получает максимальное значение на группу, объединенную в несколько столбцов - PullRequest
0 голосов
/ 23 февраля 2019

Я нашел много ответов на другие похожие запросы, но ни один из них не соответствовал моим требованиям, поэтому вопрос.

Во-первых, данные:

orderid    type    year    change
1111       1       2018    333
1111       2       2018    4652
1111       1       2019    3645
1111       3       2019    444
2222       1       2018    6451

есть объединенный ключ на столбцахorderid, тип и год.Таким образом, каждый заказ может иметь одну запись в год для определенного типа.

Теперь желаемый результат (вариант 1):

orderid    type    year    change
1111       2       2018    4652
1111       1       2019    3645

То, что я ищу, - это максимальное изменение.стоимость данного заказа в год.Тип не имеет значения.'1111' - это порядок выборки, переданный запросу.

И если первая задача может быть улучшена дальше, в идеале я хотел бы получить сумму изменений из ответа выше.Таким образом, идеальные результаты должны выглядеть следующим образом (вариант 2):

orderid    change
1111       8297

Я еще не пытался получить второй ответ, что технически должно быть простым объединением дополнительного запроса по результатам для суммированияизменение столбцов возвращается.Но то, что я пытался до сих пор для первого вопроса (и добавить - без успеха), это:

SELECT t1.*
FROM table1 t1
   LEFT JOIN table1 t2
   ON t1.orderid = t2.orderid AND t1.year = t2.year AND t1.change > t2.change
WHERE t2.change IS NULL
AND t1.orderid = '1111'

То, что этот запрос возвращает, не совсем желаемый результат, где одно максимальное значение является правильным, нодругого нет:

orderid    type    year    change
1111       1       2018    333
1111       1       2019    3645

Вот оно.Теперь, кто хотел бы сохранить мой вечер пятницы?

Помощь всегда очень важна!

Обновление 1: я включаю sqlfiddle со всем вышеперечисленным: SQLFiddle

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Ваша проблема имеет тип VARCHAR, когда вы пытаетесь сравнить значения.

Поэтому вам нужно либо CAST значения при сравнении, либо изменить схему .

 ALTER TABLE table1 MODIFY COLUMN `change` INT;

http://sqlfiddle.com/#!9/b2786a/6

SELECT t1.*
FROM table1 t1
LEFT JOIN table1 t2
ON t1.orderid = t2.orderid 
   AND t1.year = t2.year 
   AND CAST(t1.change  AS UNSIGNED)  < CAST(t2.change AS UNSIGNED)
WHERE t2.change IS NULL
AND t1.orderid = '1111';

SELECT t1.*
FROM table2 t1
LEFT JOIN table2 t2
ON t1.orderid = t2.orderid 
   AND t1.year = t2.year 
   AND t1.change < t2.change
WHERE t2.change IS NULL
AND t1.orderid = '1111'
0 голосов
/ 23 февраля 2019

Ваш SQLFiddle не работает по двум причинам.Во-первых, и самое главное, вы объявили свои значения change как VARCHAR вместо INT.В результате MySQL считает, что 444> 3645.Во-вторых, условие JOIN должно быть t1.change < t2.change, а не t1.change > t2.change.См. обновленный SQLFiddle , который дает желаемые результаты:

orderid     type    year    change
1111        2       2018    4652
1111        1       2019    3645

Если поле должно оставаться VARCHAR, вам нужно изменить условие JOIN на

CAST(t1.change AS UNSIGNED) < CAST(t2.change AS UNSIGNED)

Чтобы получить СУММУ изменений, просто используйте свой запрос в качестве подзапроса, SUM change и GROUP BY orderid:

SELECT orderid, SUM(`change`) AS total_change
FROM (SELECT t1.*
      FROM table1 t1
      LEFT JOIN table1 t2
          ON t1.orderid = t2.orderid AND t1.year = t2.year AND t1.change < t2.change
      WHERE t2.change IS NULL AND t1.orderid = '1111') t
GROUP BY orderid

Вывод:

orderid     total_change
1111        8297

Демонстрация по SQLFiddle

...