我正在编写一个分析股票价格的程序。我有两个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()来选择任何值? 答案 0 :(得分:2)
如果df2['col2'].apply(lambda x: len(x)==0)
中的值都相同,则可以删除该字段上的聚合函数。 low_table.low
然后会为它选择一个任意值,但由于它们都是相同的,所以它无关紧要。
请注意,您需要GROUP BY
到low_table.low
条款。
由于GROUP BY
中的值可能不同,因此您需要在该字段上保留聚合函数。如果你没有,则必须将它添加到sh.trading_date
子句中,这会在输出中引起额外的行。只要你必须使用一个,GROUP BY
可能与其中任何一个一样有效。