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