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

问题描述:

我有问题可以通过product_id比较分区中的某个日期。我需要检查date_to desc排序的最后一个date_to是否在日期范围内的date_from和date_to之间。Oracle SQL - 将日期与日期范围进行比较

这里的例子分区:

PRODUCT_ID | date_from | DATE_TO

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 

如何检查日期最后一排是迄今为止在分区中的product_id的任何范围之间。该订单必须完好无损。我试着用LAG函数,但它只检查前一个范围,我试着用min(date_from)和max(date_to),即使在这里也会出问题,因为min是从第一行开始,而max是从第二个开始,因为我需要限制根据产品检查每个日期范围而不是整个范围。该解决方案将检查:

*(分区的第一行)2017年1月1日和2019年5月1日(TRUE)

*之间2017年2月1日2017年2月1日之间(第二行分区)2017-04-15和2017-06-10(FALSE)

* 2017-02-01之间(第三排分区)2017-03-15和2017-03-25(FALSE)

结果:是!日期是一定范围内的日期之间)OK只是标志1就足够了:)

我会为我的英语:)

编辑任何帮助,您可以提供感激和惋惜: 电流问题是如何按照先前的范围检查每个date_to。例如。

(第二次date_to)2017-06-10之间(第一排)2017-01-01 | 2019-05-01

(3rd date_to)2017-03-25之间(第一排)2017-01-01 | 2019-05-01和(第三日期)2017-03-25之间(第二排)2017-04-15 | 2017年6月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 

演示:http://sqlfiddle.com/#!4/b351f/4

| PRODUCT_ID |    DATE_FROM |    DATE_TO | MY_FLAG | 
|------------|-----------------------|-----------------------|---------| 
|   1 | 2017-01-01 00:00:00.0 | 2019-05-01 00:00:00.0 |  Y | 
|   1 | 2017-04-15 00:00:00.0 | 2017-06-10 00:00:00.0 |  N | 
|   1 | 2017-03-15 00:00:00.0 | 2017-03-25 00:00:00.0 |  N | 
|   1 | 2017-01-19 00:00:00.0 | 2017-02-01 00:00:00.0 |  Y | 
+0

看起来相当不错!我会尝试。你有什么想法如何检查每个date_to与以前的范围?例如从第二排比较第一,第三与第一和第二比较,最后一个比较与第一,第二和第三... – caruzo

试试这个:

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_to,该产品具有该特定产品的以前日期范围。因此,对于具有最小date_to匹配此产品的至少一个日期范围的产品,或者在其他情况下为'0'的产品,您将得到'1'。

+0

请看我对下一篇文章的评论。 – caruzo

+0

为“结果”CTE添加了对查询:max函数的轻微更改。请看一下。 –

+0

Vadym感谢您的留言,但是这仍然只比较min_date_to,现在我需要检查每个日期与之前的范围date_from和date_to。正确的过程将比较从date_to到secodn的日期并将其与先前的范围进行比较。接下来从date_to获取第三个日期,并与第一行的范围进行比较,并与第二个范围进行比较...我将编辑添加到了我的问题中。 – caruzo