Группировка с операндами - PullRequest
0 голосов
/ 15 сентября 2009

У меня есть таблица:

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 голосов
/ 15 сентября 2009
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

0 голосов
/ 15 сентября 2009

Похоже, что операция LIMIT выполняется перед функцией ORDER BY. Я не эксперт (это далеко не так), но я предполагаю, что вложенный запрос должен работать:

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

Но это не совсем элегантный способ сделать это. Я уверен, что другие пользователи SO найдут лучшее решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...