用操作数分组

时间:2009-09-15 11:56:34

标签: mysql sql group-by

我有一张桌子:

mysql> desc kursy_bid;
+-----------+-------------+------+-----+---------+-------+
| Field     | Type        | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| datetime  | datetime    | NO   | PRI | NULL    |       |
| currency  | varchar(6)  | NO   | PRI | NULL    |       |
| value     | varchar(10) | YES  |     | NULL    |       |
+-----------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)

我想从表中选择一些行,按一些时间间隔(可以是一天)分组,其中我将拥有该组的第一行和最后一行,max(值)和min(值)

我试过了:

select 
  datetime, 
  (select value order by datetime asc limit 1) open, 
  (select value order by datetime desc limit 1) close, 
  max(value),
  min(value) 
from kursy_bid_test 
  where datetime > '2009-09-14 00:00:00' 
  and currency = 'eurpln' 
group by 
  month(datetime), 
  day(datetime), 
  hour(datetime);

但输出是:

| open   | close  | datetime            | max(value) | min(value) |
+--------+--------+---------------------+------------+------------+
| 1.4581 | 1.4581 | 2009-09-14 00:00:05 | 4.1712     | 1.4581     |
| 1.4581 | 1.4581 | 2009-09-14 01:00:01 | 1.4581     | 1.4581     |

如你所见,开启和关闭是相同的(但它们不应该是)。什么应该是我想要的查询?

2 个答案:

答案 0 :(得分:0)

似乎LIMIT函数之前正在执行ORDER BY操作。我不是专家(远非它),但我猜测嵌套查询的嵌套应该有效:

( (SELECT value ORDER BY datetime ASC) LIMIT 1) AS open

但这并不是一种优雅的方式。我相信其他SO用户会有更好的解决方案。

答案 1 :(得分:0)

SELECT DATE(datetime), 
       MIN(value) open, 
       MAX(value) close 
  FROM kursy_bid 
 WHERE DATE(datetime) = '2009-09-14' 
   AND currency = 'eurpln' 
GROUP BY DATE(datetime)

提示:不要使用关键字作为列名称 - 给zly nawyk:)