上个月股价连续6个工作日或以上低于一定价值
Share price less than certain value for 6 consecutive business days or more in the past month
这是 MySQL 8.X 数据库。
我的要求如下:
如果股价在过去一个月连续 6 个工作日或以上低于某个值,那么我需要通知投资者。
节假日和周末没有股价。所以这几天不会有任何数据。
例如:
在下面的数据中,股价在2021年12月14日至21日连续6个工作日低于100。我需要找到这样的股票以及股价低于目标值的天数。
effective_date
security
market_price
1-Dec-2021
STOCKNAME
99
2-Dec-2021
STOCKNAME
98
3-Dec-2021
STOCKNAME
97
6-Dec-2021
STOCKNAME
101
7-Dec-2021
STOCKNAME
99
8-Dec-2021
STOCKNAME
98
9-Dec-2021
STOCKNAME
97
10-Dec-2021
STOCKNAME
96
13-Dec-2021
STOCKNAME
102
14-Dec-2021
STOCKNAME
99
15-Dec-2021
STOCKNAME
98
16-Dec-2021
STOCKNAME
97
17-Dec-2021
STOCKNAME
96
20-Dec-2021
STOCKNAME
95
21-Dec-2021
STOCKNAME
99
22-Dec-2021
STOCKNAME
102
23-Dec-2021
STOCKNAME
103
24-Dec-2021
STOCKNAME
114
预期输出:
security number_of_days
STOCKNAME 6
这是一个间隙和孤岛问题,孤岛是连续的天数。
您需要为每个符合条件的连续行组分配一个唯一值(即值 < 100),然后计算每组中的行数,选择其中的最大值:
with g as (
select *,
Row_Number() over (partition by security order by effective_date)
- Row_Number() over (partition by security,
case when market_price<100 then 1 else 0 end order by effective_date
) cnt
from t
)
select security, Count(*) number_of_days
from g
group by security, cnt
order by number_of_days desc
limit 1
这是 MySQL 8.X 数据库。
我的要求如下: 如果股价在过去一个月连续 6 个工作日或以上低于某个值,那么我需要通知投资者。
节假日和周末没有股价。所以这几天不会有任何数据。
例如: 在下面的数据中,股价在2021年12月14日至21日连续6个工作日低于100。我需要找到这样的股票以及股价低于目标值的天数。
effective_date | security | market_price |
---|---|---|
1-Dec-2021 | STOCKNAME | 99 |
2-Dec-2021 | STOCKNAME | 98 |
3-Dec-2021 | STOCKNAME | 97 |
6-Dec-2021 | STOCKNAME | 101 |
7-Dec-2021 | STOCKNAME | 99 |
8-Dec-2021 | STOCKNAME | 98 |
9-Dec-2021 | STOCKNAME | 97 |
10-Dec-2021 | STOCKNAME | 96 |
13-Dec-2021 | STOCKNAME | 102 |
14-Dec-2021 | STOCKNAME | 99 |
15-Dec-2021 | STOCKNAME | 98 |
16-Dec-2021 | STOCKNAME | 97 |
17-Dec-2021 | STOCKNAME | 96 |
20-Dec-2021 | STOCKNAME | 95 |
21-Dec-2021 | STOCKNAME | 99 |
22-Dec-2021 | STOCKNAME | 102 |
23-Dec-2021 | STOCKNAME | 103 |
24-Dec-2021 | STOCKNAME | 114 |
预期输出:
security number_of_days
STOCKNAME 6
这是一个间隙和孤岛问题,孤岛是连续的天数。
您需要为每个符合条件的连续行组分配一个唯一值(即值 < 100),然后计算每组中的行数,选择其中的最大值:
with g as (
select *,
Row_Number() over (partition by security order by effective_date)
- Row_Number() over (partition by security,
case when market_price<100 then 1 else 0 end order by effective_date
) cnt
from t
)
select security, Count(*) number_of_days
from g
group by security, cnt
order by number_of_days desc
limit 1