使用CASE时如何不使用MAX

时间:2014-10-29 19:37:25

标签: mysql

有什么方法可以使用CASE但不能使用MAX来获取我想要的值吗? 我当前的查询是这样的

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 个答案:

答案 0 :(得分:1)

这里的问题是,MySQL真的让你做一些它不应该做的事情。

在标准SQL中,如果您有GROUP BY子句,则SELECT子句中的每个元素都必须符合以下两个类别之一:

1)它的聚合函数MAX,SUM,COUNT等。 2)它也在GROUP BY子句中命名。

您所看到的问题是,当您没有" MAX"时,MySQL会从任意行中选择一个值。

在此处详细了解此(可怕)行为:http://dev.mysql.com/doc/refman/5.6/en/group-by-handling.html

我为您创建了这个SQLFiddle:http://sqlfiddle.com/#!2/c17f6/4

当有多个"值时,您在寻找什么行为"在相同ID的相同15分钟时间范围内?我的猜测是你想要MAX,AVG,SUM或FIRST