Oracle SQL-将日期与日期范围进行比较
我在按产品id比较分区中的一个日期时遇到问题。我需要检查最后一个日期\u到按日期\u到描述订购的日期是否在日期范围内的日期\u从和日期\u到之间 下面是分区的示例: 产品标识日期(从日期)到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划分的分区
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日期,并将其与以前的范围进行比较。下一步,从日期到第三个日期,并与第一行的范围进行比较,然后与第二行的范围进行比较。。。我在问题中添加了编辑。