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