股价在过去一个月内连续 6 个或以上营业日低于一定价值

Posted

技术标签:

【中文标题】股价在过去一个月内连续 6 个或以上营业日低于一定价值【英文标题】:Share price less than certain value for 6 consecutive business days or more in the past month 【发布时间】:2021-12-28 08:24:19 【问题描述】:

这是 mysql 8.X 数据库。

我的要求如下: 如果股价在过去一个月内连续 6 个工作日或更长时间低于某个值,我需要通知投资者。

节假日和周末不会有任何股价。所以这些天不会有任何数据。

例如: 在以下数据中,2021 年 12 月 14 日至 12 月 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

【问题讨论】:

你的日期真的是这样存储的吗? 嗨鲑鱼。数据存储如示例中所示。周末和节假日不会有任何股价可用。所以日期会有差距。谢谢你。瓦迪。 '周末没有任何可用的股价' - 那么不能连续 6 个工作日?肯定5是最大值?请根据示例数据发布您的预期结果以帮助澄清。 上个月是几月?如果今天是 12 月 28 日,那么是指整个 11 月还是从今天起过去 30 天? 嗨鲑鱼。我在问题中添加了上面的预期输出。需要的是股票名称和股价低于目标值的天数。连续工作日是指工作日,不包括周末和节假日。所以可以超过5天。谢谢。 【参考方案1】:

这是一个间隙和岛屿问题,岛屿是连续的日子。

您需要为每个符合条件的连续行组分配一个唯一值(即值

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

Example Fiddle

【讨论】:

嗨,斯图。非常感谢您的回复。让我检查一下。 嗨,斯图。您的解决方案适用于我提供的示例数据。非常感谢你的帮助。非常感激。但是,我现在正试图让它在完整的数据集上工作。我会让你知道结果。我已将您的答案标记为正确。再次感谢您的帮助。

以上是关于股价在过去一个月内连续 6 个或以上营业日低于一定价值的主要内容,如果未能解决你的问题,请参考以下文章

如何获取过去 6 个月内为 sonarqube 创建的项目的报告?

有啥好的新的网络开发者浏览器插件吗? (如在过去 6 个月内发布)

在 SQL Server 中查找给定 12 个月内 6 个月的最高连续期间

在 Bigquery 中计算过去 3 个月内活跃的供应商数量

从 Facebook 群组收集数据

计算6个月内的所有日期,而不是整体