2014-10-29 2 views
0

Есть ли способ использовать CASE, но не использовать MAX для получения значения, которое я хочу? Мой текущий запрос как этотКак не использовать MAX при использовании CASE

SELECT 
    ROUND(MAX(CASE WHEN id = '1' THEN value END),2) Val1, 
    ROUND(MAX(CASE WHEN id = '2' THEN value END),2) Val2, 
    ROUND(MAX(CASE WHEN id = '3' THEN value END),2) Val3 

FROM table 
WHERE id IN ("1", "2", "3") and 

t_stamp BETWEEN "2014-10-25" AND "2014-10-25" 

GROUP BY DATE(t_stamp), HOUR(t_stamp), MINUTE(t_stamp) DIV 15 

Было бы замечательно, если я могу просто получить реальное значение для тех времен, а не значение MAX.

Я попытался удалить MAX, но все выходные стал NULL

SELECT 
    ROUND((CASE WHEN id = '1' THEN value END),2) Val1, 
    ROUND((CASE WHEN id = '2' THEN value END),2) Val2, 
    ROUND((CASE WHEN id = '3' THEN value END),2) Val3 

FROM table 
WHERE id IN ("1", "2", "3") and 

t_stamp BETWEEN "2014-10-25" AND "2014-10-25" 

GROUP BY DATE(t_stamp), HOUR(t_stamp), MINUTE(t_stamp) DIV 15 

Как я могу это сделать? Спасибо за помощь в продвижении!

ответ

1

Проблема в том, что MySQL действительно позволяет вам делать то, чего он не должен делать.

В стандартном SQL, если у вас есть предложения GROUP BY, каждый элемент вы ВЫБРАТЬ пункт должен укладываться в одну из двух категорий:

1) его агрегатной функции MAX, SUM, COUNT и т.д. 2) Он ТАКЖЕ указан в предложении GROUP BY.

Проблема, которую вы видите, заключается в том, что, когда у вас нет МАКСЫ, MySQL выбирает значение из произвольной строки.

Подробнее об этом (ужасном) поведение здесь: http://dev.mysql.com/doc/refman/5.6/en/group-by-handling.html

Я создал этот SQLFiddle для вас: http://sqlfiddle.com/#!2/c17f6/4

Какое поведение вы ищете, когда есть несколько «ценности» в том же 15 минутный интервал времени для одного и того же идентификатора? Я предполагаю, что вы хотите MAX, AVG, SUM или FIRST

+0

Я определенно не хочу использовать MAX, я думаю, что FIRST станет следующим выбором. Как мне это сделать? Просто измените MAX на FIRST? – sleepsleepsleep90731

+0

Ну, я знал, что вы скажете, что MySQL не реализует FIRST. Это может помочь, если вы объясните, что на самом деле означают эти данные. Может быть, вы можете использовать GROUP_CONCAT для лучшего понимания ваших данных? –

+0

да, я проверил group_concat, и я думаю, что просто буду использовать это. Но .. как я могу использовать его для запроса, который у меня уже есть? могу ли я просто изменить MAX на GROUP_CONCAT? – sleepsleepsleep90731

Смежные вопросы