У меня есть требование, в котором значение столбца нужно разбить на два столбца rangefrom и rangeto - PullRequest
0 голосов
/ 06 января 2020

У меня есть требование, при котором столбец msn нужно разбить на rangefrom и rangeto таблицы.

num    msn    date

1ab    5       25/2/2019
1ab    7       25/2/2019
1ab    8       25/2/2019
1ac    8       25/4/2019
1ad    9       25/5/2019
1ad    10       25/5/2019
1ad    11       25/5/2019

вывод должен выглядеть так, если msn не является непрерывным, тогда то же значение переходит к rangefrom и rangeto, если непрерывное, тогда минимальное значение будет go в диапазоне от максимального значения будет go в диапазоне от даты и номера

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

Ответы [ 2 ]

1 голос
/ 09 января 2020

С 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"

См. demo . Результаты:

> num | RANGEFROM | RANGETO | date     
> :-- | --------: | ------: | :--------
> 1ab |         5 |       5 | 25/2/2019
> 1ab |         7 |       8 | 25/2/2019
> 1ac |         8 |       8 | 25/4/2019
> 1ad |         9 |      11 | 25/5/2019
1 голос
/ 07 января 2020

Вы можете попробовать запрос ниже -

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...