代码之家  ›  专栏  ›  技术社区  ›  Saqib Ali

mysql中是否有一个聚合函数,只从一个系列中选取任何值?

  •  0
  • Saqib Ali  · 技术社区  · 6 年前

    我正在写一个分析股票价格的程序。我有两个加载了伪数据的MySQL表,如下所示。

    mysql> select * from stock;
    +----+--------+
    | id | symbol |
    +----+--------+
    |  1 | A      |
    |  2 | B      |
    |  3 | C      |
    |  4 | D      |
    |  5 | E      |
    |  6 | F      |
    +----+--------+
    6 rows in set (0.00 sec)
    
    mysql> select * from stockhistory;
    +----+--------------+-----------+
    | id | trading_date | close     |
    +----+--------------+-----------+
    |  1 | 2018-01-01   | 200.00000 |
    |  2 | 2018-01-02   | 150.00000 |
    |  3 | 2018-01-03   | 120.00000 |
    | 10 | 2018-04-28   | 105.00000 |
    | 18 | 2018-05-02   | 105.00000 |
    |  4 | 2018-05-03   | 105.00000 |
    |  9 | 2017-05-02   | 400.00000 |
    |  5 | 2017-11-11   | 200.00000 |
    |  6 | 2017-11-12   | 300.00000 |
    |  7 | 2017-11-13   | 400.00000 |
    |  8 | 2017-11-14   | 500.00000 |
    | 11 | 2018-04-28   | 105.00000 |
    | 12 | 2018-04-29   | 106.00000 |
    | 13 | 2018-04-30   | 107.00000 |
    | 14 | 2018-05-01   | 108.00000 |
    | 15 | 2018-05-02   | 109.00000 |
    | 16 | 2018-05-03   | 110.00000 |
    | 17 | 2018-05-04   |  90.00000 |
    +----+--------------+-----------+
    18 rows in set (0.01 sec)
    

    我想找出过去一周内创下年度低点的所有股票。但为了让这个问题更简单,假设我想看看所有收盘价自 '2017-05-04' 发生于或之后 '2018-04-30'

    这是执行此操作的查询:

    mysql> select
        ->     s.symbol,
        ->     min(sh.trading_date),
        ->     min(low_table.low)
        -> from
        ->     (
        ->         select
        ->             stock_id,
        ->             min(close) as low
        ->         from
        ->             stocks_stockhistory
        ->         where
        ->             trading_date >= '2017-05-04'
        ->         group by
        ->             stock_id
        ->     ) as low_table,
        ->     stocks_stockhistory as sh,
        ->     stocks_stock as s
        -> where
        ->     sh.stock_id = low_table.stock_id
        ->     and sh.stock_id = s.id
        ->     and sh.close = low_table.low
        ->     and sh.trading_date >= '2018-04-30'
        -> group by
        ->     s.symbol
        -> order by
        ->     s.symbol asc;
    +--------+----------------------+--------------------+
    | symbol | min(sh.trading_date) | min(low_table.low) |
    +--------+----------------------+--------------------+
    | A      | 2018-05-02           |          105.00000 |
    | C      | 2018-05-04           |           90.00000 |
    +--------+----------------------+--------------------+
    2 rows in set (0.01 sec)
    

    我的问题是关于此SQL查询的select子句。

    我想消除自那以后多次触及低点的股票的重复数据 2018-04-30

    • 要消除重复 s.symbol 字段,我按它分组。
    • 要消除重复 sh.trading_date field,我做了一个 min() 在里面。但我不在乎它是否是最小值。任何sh.trading\u日期值都可以。是否可以使用聚合函数代替min()来选取任何值?如果我不需要的话,计算最小值似乎是浪费。
    • 要消除重复 low_table.low Field,我做了一个 最小() 在里面。但我不在乎它是否是最小值。 事实上,所有的值都是相同的。 是否可以使用聚合函数代替min()来选取任何值?
    1 回复  |  直到 6 年前
        1
  •  2
  •   Nick    6 年前

    如果中的值 low_table.low 都一样,只需删除该字段上的聚合函数即可。这个 GROUP BY 然后将为其选择任意值,但由于它们都相同,因此无所谓。 请注意,您需要 low\u表。低的 到您的 分组依据 条款

    由于中的值 sh.trading_date 可能不同,您需要在该字段上保留聚合函数。如果没有,则必须将其添加到 分组依据 子句,这将导致输出中出现额外的行。只要你必须使用一个, MIN 可能和他们中的任何一个一样高效。