Sql 产品折扣,其中开始日期>=[DATE y]和产品=[PRODUCT X]),其中折扣偏移量=1我喜欢不用担心锁定,但我很难看到上次查询如何清理数据,因为您指定了:日期。此外,用户还需要查看日期范围。对于用户来说,似乎很难确定每个日期范围对应哪些值——不过,
Sql 产品折扣,其中开始日期>=[DATE y]和产品=[PRODUCT X]),其中折扣偏移量=1我喜欢不用担心锁定,但我很难看到上次查询如何清理数据,因为您指定了:日期。此外,用户还需要查看日期范围。对于用户来说,似乎很难确定每个日期范围对应哪些值——不过,,sql,database,oracle,range,overlap,Sql,Database,Oracle,Range,Overlap,产品折扣,其中开始日期>=[DATE y]和产品=[PRODUCT X]),其中折扣偏移量=1我喜欢不用担心锁定,但我很难看到上次查询如何清理数据,因为您指定了:日期。此外,用户还需要查看日期范围。对于用户来说,似乎很难确定每个日期范围对应哪些值——不过,我在问题中没有指定这一部分。 = Example 1 = In DB (Start, End, Value): (0, 10, 'X') **(30, 100, 'Z') (200, 500, 'Y') Input (20, 50, 'A')
产品折扣,其中开始日期>=[DATE y]和产品=[PRODUCT X]),其中折扣偏移量=1我喜欢不用担心锁定,但我很难看到上次查询如何清理数据,因为您指定了:日期。此外,用户还需要查看日期范围。对于用户来说,似乎很难确定每个日期范围对应哪些值——不过,我在问题中没有指定这一部分。
= Example 1 =
In DB (Start, End, Value):
(0, 10, 'X')
**(30, 100, 'Z')
(200, 500, 'Y')
Input
(20, 50, 'A')
Gives
(0, 10, 'X')
**(20, 50, 'A')
**(51, 100, 'Z')
(200, 500, 'Y')
= Example 2 =
In DB (Start, End, Value):
(0, 10, 'X')
**(30, 100, 'Z')
(200, 500, 'Y')
Input
(40, 80, 'A')
Gives
(0, 10, 'X')
**(30, 39, 'Z')
**(40, 80, 'A')
**(81, 100, 'Z')
(200, 500, 'Y')
= Example 3 =
In DB (Start, End, Value):
(0, 10, 'X')
**(30, 100, 'Z')
(200, 500, 'Y')
Input
(50, 120, 'A')
Gives
(0, 10, 'X')
**(30, 49, 'Z')
**(50, 120, 'A')
(200, 500, 'Y')
= Example 4 =
In DB (Start, End, Value):
(0, 10, 'X')
**(30, 100, 'Z')
(200, 500, 'Y')
Input
(20, 120, 'A')
Gives
(0, 10, 'X')
**(20, 120, 'A')
(200, 500, 'Y')
given range = g; input range = i; output range set = o
if i.start <= g.start
if i.end >= g.end
o_1 = i
else
o_1 = i
o_2 = (i.end + 1, g.end)
else
if i.end >= g.end
o_1 = (g.start, i.start - 1)
o_2 = i
else
o_1 = (g.start, i.start - 1)
o_2 = i
o_3 = (i.end + 1, g.end)
CREATE TABLE MY_TABLE
(START_AT NUMBER,
VALUE NUMBER,
CONSTRAINT MY_TABLE_PK (START_AT)
);
SELECT *
FROM (
SELECT *, rownum AS rn
FROM mytable
WHERE start_date <= :date
AND end_date >= :date
ORDER BY
seq DESC
)
WHERE rn = 1
SELECT *
FROM (
SELECT *, rownum AS rn2
FROM (
SELECT *
FROM (
SELECT *, rownum AS rn
FROM mytable
WHERE seq <= :lseq
AND start_date <= :date
AND end_date >= :date
ORDER BY
start_date DESC
)
WHERE rn = 1
UNION ALL
SELECT *
FROM (
SELECT *, rownum AS rn
FROM mytable
WHERE seq > :lseq
AND start_date <= :date
AND end_date >= :date
ORDER BY
seq DESC
)
WHERE rn = 1
)
ORDER BY
seq DESC
)
WHERE rn2 = 1