【发布时间】:2021-09-24 23:58:22
【问题描述】:
这是一个数据示例(我只是分享一个人的示例以帮助说明我的问题):
| ID | DATE |
|---|---|
| 1 | January 1, 2021 |
| 1 | February 1, 2021 |
| 1 | March 1, 2021 |
| 1 | April 1, 2021 |
| 1 | May 1, 2021 |
| 1 | June 1, 2021 |
ID = 个人的唯一标识符
日期 = 该人注册计划的时间
一个人最多可以注册一个计划 40 天。在该期限结束后,他们再次有资格注册。但是,有时(出于各种管理目的)某人可能会在某人有资格之前为其注册。我正在尝试找出标记哪些注册实际符合条件的最佳方法。
例如,一月份的注册很好,因为那是会员的第一次注册(因此应该标记)。但是,他们的 2 月注册并未发生在之前符合条件的注册(从 1 月开始)的 40 天之后,因此不应被标记。 3 月注册确实发生在符合条件的 1 月注册后 40 多天,因此应该标记它。之前的合格注册(3 月)的 40 天后没有发生 4 月注册,因此不应标记......
我怀疑我需要创建某种循环(我知道如何在其他编程语言中做到这一点,但不知道 SQL。我的想法是:
-
一月是第一次注册,因此应标记并移至下一行(一月存储为日期参考)。
-
2 月未在 1 月参考后 40 天后出现,因此不应标记,移至下一行(1 月仍为参考)。
-
3 月确实发生在 1 月参考之后 40 多天,因此应该标记它,移动到下一行(3 月现在是参考)
.....
谁能帮我弄清楚我该如何做到这一点?
【问题讨论】:
-
您的 Oracle 版本是多少?如果您不知道,请运行
select banner from v$version并告诉我们它报告的内容 - 类似于Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production的行(这是我运行该查询时系统报告的内容)。我的版本是 12.2.0.1.0。你的是什么? -
" 怀疑我需要创建某种循环(我知道如何在其他编程语言中做到这一点” 您需要记住的重要一点是,那些“其他语言”都是过程性的。你编写如何来做某事,一步一步。但是SQL(不仅仅是oracle)是一个描述性的 i> 语言。您编写 what 您想要的代码,然后让数据库找出 how。此外,SQL 正在使用 sets。它不是逐行语言。