2014-08-28 218 views
-1

我正在使用MariaDB 5.5,并且在选择查询时出现问题。我试图选择一列中两个日期时间之间的值的行,并按另一列中的最大日期时间分组。表结构是一样的东西SQL Group by max

|   Model_Init |   Model_Time | Location_ID | Var_ID | Value | 
| ------------------- | ------------------- | ------------| ------ | ----- | 
| 2014-08-22 06:00:00 | 2014-08-23 04:00:00 |  123456 |  23 | 76.2 | 
| 2014-08-22 06:00:00 | 2014-08-23 05:00:00 |  123456 |  23 | 77.2 | 
| 2014-08-22 06:00:00 | 2014-08-23 06:00:00 |  123456 |  23 | 78.2 | 
| 2014-08-22 06:00:00 | 2014-08-23 07:00:00 |  123456 |  23 | 79.2 | 
| 2014-08-22 06:00:00 | 2014-08-23 08:00:00 |  123456 |  23 | 80.2 | 
| 2014-08-23 06:00:00 | 2014-08-23 06:00:00 |  123456 |  23 | 81.2 | 
| 2014-08-23 06:00:00 | 2014-08-23 07:00:00 |  123456 |  23 | 82.2 | 
| 2014-08-23 06:00:00 | 2014-08-23 08:00:00 |  123456 |  23 | 83.2 | 
| 2014-08-23 06:00:00 | 2014-08-23 09:00:00 |  123456 |  23 | 84.2 | 
| 2014-08-23 06:00:00 | 2014-08-23 10:00:00 |  123456 |  23 | 85.2 | 
| 2014-08-23 06:00:00 | 2014-08-23 11:00:00 |  123456 |  23 | 86.2 | 

我想选择两个Model_Time值之间的时间连续组,即:

SELECT * 
FROM WRF_data_norm 
WHERE Location_ID=123456 AND 
     Var_ID=23 AND 
     Model_Time>='2014-08-23 04:00:00' AND 
     Model_Time<='2014-08-23 10:00:00' 
GROUP BY Model_Time; 

可能返回结果:

|   Model_Init |   Model_Time | Location_ID | Var_ID | Value | 
| ------------------- | ------------------- | ------------| ------ | ----- | 
| 2014-08-22 06:00:00 | 2014-08-23 04:00:00 |  123456 |  23 | 76.2 | 
| 2014-08-22 06:00:00 | 2014-08-23 05:00:00 |  123456 |  23 | 77.2 | 
| 2014-08-22 06:00:00 | 2014-08-23 06:00:00 |  123456 |  23 | 78.2 | 
| 2014-08-22 06:00:00 | 2014-08-23 07:00:00 |  123456 |  23 | 79.2 | 
| 2014-08-22 06:00:00 | 2014-08-23 08:00:00 |  123456 |  23 | 80.2 | 
| 2014-08-23 06:00:00 | 2014-08-23 09:00:00 |  123456 |  23 | 84.2 | 
| 2014-08-23 06:00:00 | 2014-08-23 10:00:00 |  123456 |  23 | 85.2 | 
| 2014-08-23 06:00:00 | 2014-08-23 11:00:00 |  123456 |  23 | 86.2 | 

在哪里需要Model_Time与Model_Init的最大值不同的值,即:

|   Model_Init |   Model_Time | Location_ID | Var_ID | Value | 
| ------------------- | ------------------- | ------------| ------ | ----- | 
| 2014-08-22 06:00:00 | 2014-08-23 04:00:00 |  123456 |  23 | 76.2 | 
| 2014-08-22 06:00:00 | 2014-08-23 05:00:00 |  123456 |  23 | 77.2 | 
| 2014-08-23 06:00:00 | 2014-08-23 06:00:00 |  123456 |  23 | 81.2 | 
| 2014-08-23 06:00:00 | 2014-08-23 07:00:00 |  123456 |  23 | 82.2 | 
| 2014-08-23 06:00:00 | 2014-08-23 08:00:00 |  123456 |  23 | 83.2 | 
| 2014-08-23 06:00:00 | 2014-08-23 09:00:00 |  123456 |  23 | 84.2 | 
| 2014-08-23 06:00:00 | 2014-08-23 10:00:00 |  123456 |  23 | 85.2 | 
| 2014-08-23 06:00:00 | 2014-08-23 11:00:00 |  123456 |  23 | 86.2 | 

我不知道如何改变查询。

编辑:找到解决方案:

SELECT Max(Model_Init), Model_Time,Location_ID, Var_ID,Value FROM WRF_data_norm GROUP BY Model_Time, Location_ID, Var_ID, Value HAVING Location_ID=123456 AND Var_ID=23 AND Model_Time>='2014-09-23 04:00:00' AND Model_Time<='2014-09-23 11:00:00' ORDER BY Model_Time;

+1

我看到你得到的结果和你想要的结果没有区别。 – 2014-08-28 02:42:23

+0

因为我也无法发现它们之间的区别,所以也许你依靠不可靠的'MySQL扩展'来执行'GROUP BY';请参阅http://dev.mysql.com/doc/refman/5.0/en/group-by-extensions.html其中结果可以是“不确定”的。 – 2014-08-28 02:50:45

+0

Model_Init值不同 - 组by不选择最大值对于不同的Model_Time,Model_Init的值。我可能应该使用不同的示例值,将修改帖子。 – 2014-08-28 02:51:48

回答

0

试试这个: -

SELECT Model_Init, Model_Time, Location_ID, Var_ID, MAX(Value) 
FROM WRF_data_norm 
WHERE Location_ID=123456 AND 
Var_ID=23 AND 
Model_Time>='2014-08-23 04:00:00' AND 
Model_Time<='2014-08-23 10:00:00' 
GROUP BY Model_Init, Model_Time, Location_ID, Var_ID; 

这可能会对你有所帮助。

+0

我收到了一个空集与此查询,但是你让我想到了一些尝试哪些工作: SELECT Max(Model_Init), Model_Time,Location_ID,Var_ID,Value FROM WRF_data_norm GROUP BY Model_Time,Location_ID,Var_ID,Value HAVING Location_ID = 123456 AND Var_ID = 23 AND Model_Time> ='2014-09-23 04:00:00'AND Model_Time <=' 2014-09-23 11:00:00' ORDER BY Model_Time; – 2014-08-28 04:03:59

+1

对于那些过滤条件没有必要使用'HAVING'子句,它可以通过'WHERE'子句 – 2014-08-28 04:13:56

+0

来实现Your Model_Init是相同的。所以在Model_Init中不会使用max。您需要col值的最大值,您必须使用max值和col值。 – 2014-08-28 09:48:12