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

ma8fv8wu  于 2021-06-25  发布在  Mysql
关注(0)|答案(1)|浏览(261)

我正在写一个分析股票价格的程序。我有两个加载了伪数据的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 field,我按它分组。
重复数据消除 sh.trading_date 菲尔德,我做一个 min() 在里面。但我不管它是不是最小值。任何交易日价值都可以。是否有一个聚合函数可以代替min()来选取任何值?如果我不需要的话,计算最小值似乎很浪费。
重复数据消除 low_table.low 菲尔德,我做一个 min() 在里面。但我不管它是不是最小值。实际上,所有的值都是相同的。是否有一个聚合函数可以代替min()来选取任何值?

whhtz7ly

whhtz7ly1#

如果 low_table.low 都是相同的,您只需删除该字段上的聚合函数。这个 GROUP BY 然后将为它选择一个任意值,但由于它们都相同,所以无所谓。请注意,您需要 low_table.low 给你的 GROUP BY 条款。
因为 sh.trading_date 如果不同,则需要在该字段上保留聚合函数。如果你没有,你就得把它加到 GROUP BY 子句,这将导致输出中出现额外的行。只要你必须用一个, MIN 可能和他们一样有效率。

相关问题