Oracle SQL-将日期与日期范围进行比较

Oracle SQL-将日期与日期范围进行比较,sql,oracle,Sql,Oracle,我在按产品id比较分区中的一个日期时遇到问题。我需要检查最后一个日期\u到按日期\u到描述订购的日期是否在日期范围内的日期\u从和日期\u到之间 下面是分区的示例: 产品标识日期(从日期)到 1 | 2017-01-01| 2019-05-01 1 | 2017-04-15| 2017-06-10 1 | 2017-03-15| 2017-03-25 1 | 2017-01-19| 2017-02-01 如何检查最后一行中的日期是否在按产品id划分的分区

我在按产品id比较分区中的一个日期时遇到问题。我需要检查最后一个日期\u到按日期\u到描述订购的日期是否在日期范围内的日期\u从和日期\u到之间

下面是分区的示例:

产品标识日期(从日期)到

 1     | 2017-01-01| 2019-05-01
 1     | 2017-04-15| 2017-06-10
 1     | 2017-03-15| 2017-03-25
 1     | 2017-01-19| 2017-02-01
如何检查最后一行中的日期是否在按产品id划分的分区中的任何日期范围之间。此顺序必须完整。我尝试使用滞后函数检查,但它只会检查前一个范围,我尝试使用最小值(日期从)和最大值(日期从)即使在这里也会出现问题,因为最小值是第一行,最大值是第二行,限定值为假,因为我需要按产品检查每个日期范围,而不是整个范围。解决方案将检查:

*2017-02-01(第一排隔板)2017-01-01和2019-05-01(真实)

*2017-02-01(第二排隔板)2017-04-15和2017-06-10之间(假)

*2017-02-01(第三排隔板)2017-03-15和2017-03-25之间(假)

结果:是的!日期介于某个日期范围之间;)好的,只需标记1即可:)

如果您能提供任何帮助,我将不胜感激,并为我的英语感到抱歉:)

编辑: 当前的问题是如何按照之前的范围检查每个日期。例如

(第二日期)2017-06-10(第一行)2017-01-01 | 2019-05-01

(第三日期)2017-03-25(第一行)2017-01-01 | 2019-05-01和(第三日期)2017-03-25(第二行)2017-04-15 | 2017-06-10

等等。

试试:

SELECT t1.*,
       CASE WHEN first_value( date_to ) OVER (Partition by product_id Order by date_to )
                 BETWEEN date_from AND date_to
                 THEN 'Y' ELSE 'N'
       END As my_flag
FROM table1 t1
ORDER BY date_to DESC
演示:

尝试:

演示:

试试这个:

WITH results AS (
  SELECT
    t.product_id,
    max(case when t.min_date_to BETWEEN t.date_from AND t.date_to
      then 1
      else 0
    end) AS result
  FROM (
    SELECT
      x.*,
      min(x.date_to) over (partition by x.product_id) AS min_date_to
    FROM
      your_table x
  ) t
)
SELECT DISTINCT
  x.product_id,
  r.result
FROM
  your_table x
JOIN
  results r ON r.product_id = x.product_id;
结果如下:

| PRODUCT_ID | RESULT  |
|------------|---------|
|        111 |       1 |
|        222 |       1 |
|        333 |       0 |
|        444 |       1 |
|        554 |       0 |
此查询检查每个产品的最小
date\u至
,以及该特定产品以前的日期范围。因此,对于那些具有最小
date\u to
匹配此产品至少一个日期范围的产品,您将获得“1”,或者在其他情况下为“0”。

尝试以下操作:

WITH results AS (
  SELECT
    t.product_id,
    max(case when t.min_date_to BETWEEN t.date_from AND t.date_to
      then 1
      else 0
    end) AS result
  FROM (
    SELECT
      x.*,
      min(x.date_to) over (partition by x.product_id) AS min_date_to
    FROM
      your_table x
  ) t
)
SELECT DISTINCT
  x.product_id,
  r.result
FROM
  your_table x
JOIN
  results r ON r.product_id = x.product_id;
结果如下:

| PRODUCT_ID | RESULT  |
|------------|---------|
|        111 |       1 |
|        222 |       1 |
|        333 |       0 |
|        444 |       1 |
|        554 |       0 |

此查询检查每个产品的最小
date\u至
,以及该特定产品以前的日期范围。因此,对于那些具有最小
date\u to
匹配此产品的至少一个日期范围的产品,您将获得“1”,或者在其他情况下为“0”。

它看起来相当不错!我试试看。你知道如何用以前的范围检查每个日期吗?例如,第二行的日期与第一行比较,第三行与第一行和第二行比较,最后一行与第一行、第二行和第三行比较……看起来相当不错!我试试看。你知道如何用以前的范围检查每个日期吗?例如,日期从第二行与第一行比较,第三行与第一行和第二行比较,最后一行与第一行、第二行和第三行比较……请看我在下一篇文章中的评论。为“结果”CTE的查询:max函数添加了小改动。请看一看。Vadym感谢您的消息,但这仍然只比较min_date_to,现在我需要检查每个日期与以前的日期范围date_from和date_to。正确的程序将比较从日期_到的secodn日期,并将其与以前的范围进行比较。下一步,从日期到第三个日期,并与第一行的范围进行比较,然后与第二行的范围进行比较。。。我在我的问题中添加了编辑。请在下一篇文章中查看我的评论。为“结果”CTE的query:max函数添加了小的更改。请看一看。Vadym感谢您的消息,但这仍然只比较min_date_to,现在我需要检查每个日期与以前的日期范围date_from和date_to。正确的程序将比较从日期_到的secodn日期,并将其与以前的范围进行比较。下一步,从日期到第三个日期,并与第一行的范围进行比较,然后与第二行的范围进行比较。。。我在问题中添加了编辑。