mysql在另一个流行值查询的结果中查找流行值

jtw3ybtb  于 2021-06-21  发布在  Mysql
关注(0)|答案(0)|浏览(210)

我有一张满是股票和期权头寸的表格(“期权头寸”是期权到期日和行权价格的组合)。列:

userID - the person who owns the position
stock_symbol - the stock they own
call_expiration - expiration date for a call option they've sold against the stock
call_strike - strike price for the same call option

用户可以对同一个股票代号拥有多个股票仓位,如果他们拥有,那么他们可能会对同一个代号拥有不同的看涨期权。例如,用户399在aapl中有3个位置,每个位置具有不同的看涨期权:

+---------+--------------+-----------------+-------------+
| user_id | stock_symbol | call_expiration | call_strike |
+---------+--------------+-----------------+-------------+
|     399 | AAPL         | 2018-07-20      |         185 |
|     399 | AAPL         | 2018-07-20      |         190 |
|     399 | AAPL         | 2018-08-17      |         180 |
|     399 | X            | 2018-07-20      |          13 |
|     802 | AAPL         | 2018-07-20      |         190 |
|     802 | X            | 2019-01-18      |          14 |
|     802 | MU           | 2018-07-20      |          38 |
|     802 | MIC          | 2018-07-20      |        42.5 |
|     802 | AAPL         | 2018-07-20      |         190 |
|    1079 | MU           | 2018-08-17      |          39 |
|    1079 | X            | 2018-07-20      |          14 |

我想知道哪些股票是最常持有的,但我希望每个用户有1票(在上面的数据符号中x获胜,因为3个用户在其中有一个位置;aapl拥有更多的职位,但只有2个用户拥有这些职位)。因此,如果同一个用户在同一个股票代码中有多个位置,那么它只算作该股票代码的一票。如果存在连接频率,则按符号的字母顺序排列。也许有一个更简单的方法,但这是可行的:

SELECT stock_symbol, COUNT(*) AS symbol_count FROM 
(SELECT DISTINCT(user_id), stock_symbol FROM user_positions) AS temp
GROUP BY stock_symbol 
ORDER BY symbol_count DESC, stock_symbol ASC LIMIT 10;

然后我想知道每个流行符号最常见的失效日期。下面是我如何找到一个硬编码股票代码(aapl)。如果平局,则以最早的到期日为准:

SELECT call_expiration, COUNT(*) AS exp_count FROM positions
WHERE stock_symbol='AAPL' 
GROUP BY call_expiration 
ORDER BY exp_count DESC, call_expiration ASC;

最后,我想知道一个给定的符号和有效期最常见的执行价格。下面是我如何找到它的硬编码符号和有效期。如果平局,则最低执行价获胜:

SELECT call_strike, COUNT(*) AS strike_count FROM positions
WHERE stock_symbol='AAPL' AND call_expiration = '2018-07-20'
GROUP BY call_strike
ORDER BY strike_count DESC, call_strike ASC;

这些工作,我可以把这些调用放入一个php脚本,并循环通过第一个查询的结果(它生成了10个最常见的股票符号),但我想知道是否有办法让mysql为我做所有这些。
最终目标是这样一张表:

popular position #1: S1   E1   K1
popular position #2: S2   E2   K2
popular position #3: S3   E3   K3

哪里:

S1 = the most commonly held stock_symbol when each user gets 1 vote
E1 = the most common expiration date across all positions for symbol S1 (if a user has multiple positions for that symbol then you can consider all of them)
K1 = the most common call_strike for all positions where the symbol and expiraiton date are fixed at S1 and E1. (if a user has multiple positions for that symbol then you can consider all of them)

我不确定这是不是一个坏主意,但我想在我的查询中创建中间列concat call\u expiration+call\u strike,或者所有3个:symbol+expiration+strike;我不太明白,因为在第一种情况下(最流行的符号),我希望用户每个只有1票,但在接下来的2个查询中(最流行的到期日和到期日最流行的执行价),可以考虑用户的所有位置,即使他们有超过1个相同的符号。一次查询可能太多了?
---6/24/18在下面添加了示例数据---

CREATE TABLE test_positions (
position_id int unsigned auto_increment,
user_id int unsigned,
stock_symbol varchar(10),
call_expiration date,
call_strike float,
primary key (position_id)
);

INSERT INTO test_positions 
 (user_id, stock_symbol, call_expiration, call_strike)
VALUES 
 (399,  'AAPL', '2018-07-20', 185),
 (399,  'AAPL', '2018-07-20', 190),
 (399,  'AAPL', '2018-08-17', 190),
 (399,  'AAPL', '2018-09-21', 180),
 (399,  'X',    '2018-07-20', 35),
 (802,  'X',    '2018-07-20', 35.5),
 (1079, 'X',    '2018-07-20', 35),
 (1079, 'X',    '2018-07-20', 35.5),
 (1079, 'AAPL', '2018-07-20', 190),
 (1079, 'AAPL', '2018-07-20', 185),
 (1079, 'MRK',  '2018-07-20', 62.5),
 (1079, 'MRK',  '2018-08-17', 60);

使用此数据的所需查询结果是:

+--------------+-----------------+-------------+
| stock_symbol | call_expiration | call_strike |
+--------------+-----------------+-------------+
| X            | 2018-07-20      |          35 |
| AAPL         | 2018-07-20      |         190 |
| MRK          | 2018-07-20      |        62.5 |
+--------------+-----------------+-------------+

因为符号x由3个用户持有。尽管aapl有更多的位置,但是只有2个独特的用户在aapl中有位置,所以我们要说x比aapl更受欢迎。
在symbol x的4个位置中,最常见的call\u expiration是2018-07-20,如果我们查看symbol为x的所有call\u罢工,call\u expiration是2018-07-20,那么这是一个平局(2有35,2有35.5),所以我们要选择2中的较低者。
在mrk的2个仓位中,看涨期权到期日是平局(2个日期各1个),因此我们选择2个仓位中的较早者(2018-07-20),然后如果您查看symbol mrk的所有仓位,其中看涨期权到期日是2018-07-20,则最常见的看涨期权罢工是62.50。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题