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

时间:2018-05-10 03:18:27

标签: mysql

我正在编写一个分析股票价格的程序。我有两个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-clause。

我希望对自2018-04-30以来不止一次触及低点的股票进行重复排序。

  • 为了对s.symbol字段进行重复数据删除,我将其分组。
  • 要对sh.trading_date字段进行重复数据删除,我会在其中执行min()。但我不在乎它是否是最小值。任何sh.trading_date值都可以。是否有一个聚合函数,我可以使用而不是min()来选择任何值?如果我不需要它,计算最小值似乎很浪费。
  • 要对low_table.low字段进行重复数据删除,我会在其中执行min()。但我不在乎它是否是最小值。 实际上,所有的值都是相同的。我是否可以使用聚合函数而不是min()来选择任何值?

1 个答案:

答案 0 :(得分:2)

如果df2['col2'].apply(lambda x: len(x)==0) 中的值都相同,则可以删除该字段上的聚合函数。 low_table.low然后会为它选择一个任意值,但由于它们都是相同的,所以它无关紧要。 请注意,您需要GROUP BYlow_table.low条款。

由于GROUP BY中的值可能不同,因此您需要在该字段上保留聚合函数。如果你没有,则必须将它添加到sh.trading_date子句中,这会在输出中引起额外的行。只要你必须使用一个,GROUP BY可能与其中任何一个一样有效。