這適用于 MySQL 8.X 資料庫。
我的要求如下:如果股價在過去一個月內連續6個作業日或以上低于某個值,那么我需要通知投資者。
節假日和周末不會有任何股價。所以這些天不會有任何資料。
例如:在下面的資料中,股價在 2021 年 12 月 14 日至 21 日之間連續 6 個作業日低于 100。我需要找到這些股票以及股價低于目標值的天數。
| 生效日期 | 安全 | 市場價 |
|---|---|---|
| 2021 年 12 月 1 日 | 股票名稱 | 99 |
| 2-Dec-2021 | 股票名稱 | 98 |
| 2021 年 12 月 3 日 | 股票名稱 | 97 |
| 2021 年 12 月 6 日 | 股票名稱 | 101 |
| 2021 年 12 月 7 日 | 股票名稱 | 99 |
| 2021 年 12 月 8 日 | 股票名稱 | 98 |
| 2021 年 12 月 9 日 | 股票名稱 | 97 |
| 2021 年 12 月 10 日 | 股票名稱 | 96 |
| 2021 年 12 月 13 日 | 股票名稱 | 102 |
| 2021 年 12 月 14 日 | 股票名稱 | 99 |
| 2021 年 12 月 15 日 | 股票名稱 | 98 |
| 2021 年 12 月 16 日 | 股票名稱 | 97 |
| 2021 年 12 月 17 日 | 股票名稱 | 96 |
| 2021 年 12 月 20 日 | 股票名稱 | 95 |
| 2021 年 12 月 21 日 | 股票名稱 | 99 |
| 2021 年 12 月 22 日 | 股票名稱 | 102 |
| 2021 年 12 月 23 日 | 股票名稱 | 103 |
| 2021 年 12 月 24 日 | 股票名稱 | 114 |
預期輸出:
security number_of_days
STOCKNAME 6
uj5u.com熱心網友回復:
這是一個間隙和島嶼問題,島嶼是連續的日子。
您需要為每個連續的符合條件的行組分配一個唯一值(即值 < 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
示例小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/396736.html
