【问题标题】:Grouping with operands使用操作数分组
【发布时间】:2010-11-28 10:37:29
【问题描述】:

我有一张桌子:

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(value) 和 min(value) .

我试过了:

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     |

正如您所见,打开和关闭是相同的(但它们不应该如此)。做我想做的事情的查询应该是什么?

【问题讨论】:

    标签: mysql sql group-by


    【解决方案1】:

    似乎LIMIT 操作在ORDER BY 函数之前执行。我不是专家(远非如此),但我猜嵌套嵌套查询应该可以工作:

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

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

    【讨论】:

      【解决方案2】:
      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)
      

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

      【讨论】:

      • 很抱歉,这离我想要的帽子很远,你读过整个问题吗? :) 并且用“关键字”命名库还不错,不会造成任何问题:)
      • 而且 - 使 date(datetime) = '2009-09-14' 比 datetime > '2009-09-14' 慢得多(不使用索引)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-07
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多