2017-07-25 189 views
0

我有問題可以通過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日

回答

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 | 
+0

看起來相當不錯!我會嘗試。你有什麼想法如何檢查每個date_to與以前的範圍?例如從第二排比較第一,第三與第一和第二比較,最後一個比較與第一,第二和第三... – caruzo

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,該產品具有該特定產品的以前日期範圍。因此,對於具有最小date_to匹配此產品的至少一個日期範圍的產品,或者在其他情況下爲'0'的產品,您將得到'1'。

+0

請看我對下一篇文章的評論。 – caruzo

+0

爲「結果」CTE添加了對查詢:max函數的輕微更改。請看一下。 –

+0

Vadym感謝您的留言,但是這仍然只比較min_date_to,現在我需要檢查每個日期與之前的範圍date_from和date_to。正確的過程將比較從date_to到secodn的日期並將其與先前的範圍進行比較。接下來從date_to獲取第三個日期,並與第一行的範圍進行比較,並與第二個範圍進行比較...我將編輯添加到了我的問題中。 – caruzo