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

时间:2017-07-25 19:45:11

标签: sql oracle

我在使用product_id比较分区中的一个日期时遇到问题。我需要检查date_to desc命令的last_to是否在date_from和date_to之间的日期范围内。

以下是分区的例子:

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-01-01(第一行分区)2017-01-01和2019-05-01(TRUE)之间的* 2017-02-01

* 2017-02-01之间(第二行分区)2017-04-15和2017-06-10(FALSE)

* 2017-02-01(分区的第三行)2017-03-15和2017-03-25(FALSE)

结果:是的!日期在某些日期之间;)好的只是标志1就足够了:)

我将非常感谢您提供的任何帮助,并对我的英语表示抱歉:)

修改 目前的问题是如何按照先前的范围检查每个date_to。 E.g。

(second date_to)2017-06-10(第一行)2017-01-01 | 2019年5月1日

(third date_to)2017-03-25(第一行)2017-01-01 | 2019-05-01和(第三个date_to)2017-03-25之间(第二行)2017-04-15 | 2017年6月10日

2 个答案:

答案 0 :(得分:2)

尝试:

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 |

答案 1 :(得分:1)

试试这个:

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以及该特定产品的先前日期范围。结果你得到了' 1'对于最少date_to个匹配此产品的至少一个日期范围的产品,或者' 0' - 在其他情况下。