Oracle 我有一个要求,其中列值需要分为两列rangefrom和rangeto

Oracle 我有一个要求,其中列值需要分为两列rangefrom和rangeto,oracle,Oracle,我有一个要求,msn列需要分为rangefrom和rangeto 桌子 如果msn不连续,则输出应该是这样的:相同的值将转到rangefrom和rangeto如果连续,则最小值将转到rangefrom,最大值将根据日期和数值转到rangeto num rangefrom rangeto date 1ab 5 5 25/2/2019 1ab 7 8 25/2/2019 1ad 9 11

我有一个要求,msn列需要分为rangefrom和rangeto 桌子

如果msn不连续,则输出应该是这样的:相同的值将转到rangefrom和rangeto如果连续,则最小值将转到rangefrom,最大值将根据日期和数值转到rangeto

num   rangefrom  rangeto   date
1ab     5         5        25/2/2019
1ab     7         8        25/2/2019
1ad     9         11        25/4/2019

你可以试试下面的查询-

SELECT NUM, MIN(MSN), MAX(MSN), DTE
FROM (SELECT NUM, TRIM(MSN) MSN, DTE, TRIM(MSN)-ROW_NUMBER() OVER(ORDER BY DTE, TRIM(MSN)) SEQNUM
      FROM T)
GROUP BY NUM, SEQNUM, DTE
ORDER BY NUM;
这是演示1。
是演示2。

您可以尝试下面的查询-

SELECT NUM, MIN(MSN), MAX(MSN), DTE
FROM (SELECT NUM, TRIM(MSN) MSN, DTE, TRIM(MSN)-ROW_NUMBER() OVER(ORDER BY DTE, TRIM(MSN)) SEQNUM
      FROM T)
GROUP BY NUM, SEQNUM, DTE
ORDER BY NUM;
这是演示1。 是演示2。

带有
LAG()
LEAD()
窗口功能和
CTE

with cte as (
 select t.*,
    case when "msn" - lag("msn") over (partition by "num", "date" order by "msn") = 1 then 0 else 1 end isfrom,
    case when lead("msn") over (partition by "num", "date" order by "msn") - "msn" = 1 then 0 else 1 end isto
  from tablename t 
)
select c1."num", c1."msn" rangefrom, min(c2."msn") rangeto, c1."date"
from cte c1 inner join cte c2
on c2."num" = c1."num" and c2."date" = c1."date" 
and (
  (c1.isfrom = 1 and c2.isto = 1 and c1."msn" < c2."msn")
  or
  (c1.isfrom = 1 and c1.isto = 1 and c1."msn" = c2."msn")
) 
group by c1."num", c1."msn", c1."date"
order by c1."num", c1."msn", c1."date"
使用
LAG()
LEAD()
窗口功能和
CTE

with cte as (
 select t.*,
    case when "msn" - lag("msn") over (partition by "num", "date" order by "msn") = 1 then 0 else 1 end isfrom,
    case when lead("msn") over (partition by "num", "date" order by "msn") - "msn" = 1 then 0 else 1 end isto
  from tablename t 
)
select c1."num", c1."msn" rangefrom, min(c2."msn") rangeto, c1."date"
from cte c1 inner join cte c2
on c2."num" = c1."num" and c2."date" = c1."date" 
and (
  (c1.isfrom = 1 and c2.isto = 1 and c1."msn" < c2."msn")
  or
  (c1.isfrom = 1 and c1.isto = 1 and c1."msn" = c2."msn")
) 
group by c1."num", c1."msn", c1."date"
order by c1."num", c1."msn", c1."date"

1ac
发生了什么事?输出中不应该有
1ac | 8 | 8 | 25/4/2019
记录吗?你试过什么?你到底在哪里?是的。我忘了添加1ac | 8 | 8 | 25/4/2019……我是DB的新手。所以,请让我知道如何打破。这肯定会有帮助。这感觉很像一个“缺口和孤岛”问题。这些可能会让人觉得有点难看,我真希望我有时间把这件事搞清楚。
1ac
发生了什么事?输出中不应该有
1ac | 8 | 8 | 25/4/2019
记录吗?你试过什么?你到底在哪里?是的。我忘了添加1ac | 8 | 8 | 25/4/2019……我是DB的新手。所以,请让我知道如何打破。这肯定会有帮助。这感觉很像一个“缺口和孤岛”问题。这些可能会让人觉得有点难看,我真希望我有时间把这件事搞清楚。谢谢你的回复,但不幸的是它不起作用。你在演示中提到小提琴了吗?在那里工作很好。请发布更多的样本数据或真实的数据,如果可能的话,如果它在你的系统中不起作用。我用同样的方法做了…但不幸的是它不起作用。我将添加一些简单的数据tmrw…它的工作部分,但不像演示小提琴。我已经发送了你的个人电子邮件与样本数据的细节…你在你的MSN栏空间。在删除这些空格并更新查询后,我认为现在可以按预期工作了。感谢您的回复,但不幸的是它没有工作。您是否在演示中提到了小提琴?在那里工作很好。请发布更多的样本数据或真实的数据,如果可能的话,如果它在你的系统中不起作用。我用同样的方法做了…但不幸的是它不起作用。我将添加一些简单的数据tmrw…它的工作部分,但不像演示小提琴。我已经发送了你的个人电子邮件与样本数据的细节…你在你的MSN栏空间。在删除这些空格并稍微更新查询之后,我认为现在一切正常。