我在使用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日
等
答案 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' - 在其他情况下。