我正在写一个分析股票价格的程序。我有两个加载了伪数据的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()来选取任何值?
1条答案
按热度按时间whhtz7ly1#
如果
low_table.low
都是相同的,您只需删除该字段上的聚合函数。这个GROUP BY
然后将为它选择一个任意值,但由于它们都相同,所以无所谓。请注意,您需要low_table.low
给你的GROUP BY
条款。因为
sh.trading_date
如果不同,则需要在该字段上保留聚合函数。如果你没有,你就得把它加到GROUP BY
子句,这将导致输出中出现额外的行。只要你必须用一个,MIN
可能和他们一样有效率。