powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Подскажите как реализовать?
25 сообщений из 25, страница 1 из 1
Подскажите как реализовать?
    #39771819
skyner81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Подскажите как реализовать?
    #39771822
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://www.bugtraq.ru/forum/faq/general/smart-questions.html] RTFM
...
Рейтинг: 0 / 0
Подскажите как реализовать?
    #39771832
skyner81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic, тяжело объяснить что это такое. Эта таблица "План пути (точки излома кривых)", где km-Километр точки излома кривой
m-Метр точки излома кривой, r-Радиус. В этой таблице эти точки излома идут друг за другом. А нужно получить КМ и И Начала кривой, КМ и М конца кривой, радиус.
...
Рейтинг: 0 / 0
Подскажите как реализовать?
    #39771848
alex-ls
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
опять between с left join
...
Рейтинг: 0 / 0
Подскажите как реализовать?
    #39771850
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyner81А нужно получить КМ и И Начала кривой, КМ и М конца кривой, радиус.Ну так и получай. Но только таким же неалгоритмическим способом. Например на гуманитарном форуме.
...
Рейтинг: 0 / 0
Подскажите как реализовать?
    #39771866
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyner81 km-Километр точки излома кривой
m-Метр точки излома кривойТипичный пример излома кривой нормализации.
...
Рейтинг: 0 / 0
Подскажите как реализовать?
    #39771869
skyner81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alex-lsопять between с left join

Как использовать between если значение начала и конца в разных строчках?
...
Рейтинг: 0 / 0
Подскажите как реализовать?
    #39771871
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyner81Как использовать between если значение начала и конца в разных строчках?Надежда на халяву умирает последней?

STFF start_of_group
...
Рейтинг: 0 / 0
Подскажите как реализовать?
    #39771873
skyner81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ElicНадежда на халяву умирает последней?
Да, BETWEEN мне подойдет.
...
Рейтинг: 0 / 0
Подскажите как реализовать?
    #39771882
alex-ls
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyner81alex-lsопять between с left join
Как использовать between если значение начала и конца в разных строчках?
к сожалению я сразу не понял суть задачи
тут скорее self join и lag/lead на форуме куча вопросов по интервалам. Вам надо что-то типа объединить интервалы, а дальше пробовать
...
Рейтинг: 0 / 0
Подскажите как реализовать?
    #39771895
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyner81Да, BETWEEN мне подойдет.Глупость человечья безгранична…
...
Рейтинг: 0 / 0
Подскажите как реализовать?
    #39771902
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>skyner81, сегодня, 14:55 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1308901&msg=21805666][21805666]
<Если знаешь, как (1) преобразовать во (2), то закачивай построчно выборку (1) на рабочую станцию и, используя нормальный язык, формируй (2).
...
Рейтинг: 0 / 0
Подскажите как реализовать?
    #39771907
skyner81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic по вашей подсказке нашел пример, он работает если R равен одному значению у КММ_начала и КММ_конца кривой.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
with t (KMM, R) as (
  select 662.065, 1100 from dual union all
  select 662.0774, 1100  from dual union all
  select 662.0841, 1100  from dual union all
  select 662.099, 1100  from dual)

select min (KMM) as KMMN,
       max (KMM) as KMMK,
       R
from (select KMM,R,
sum(strt_grp) over (order by KMM, R ) grp_num
from (select KMM,R,
case when KMM > 1 + max(KMM) over (order by KMM, R rows between unbounded preceding and 1 preceding) then 1 end strt_grp
from t))
group by grp_num,R
order by KMMN



В моем случае у КММ_начала и КММ_конца R=0 и соответственно группируется неправильно
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
with t (KMM, R) as (
  select 662.065, 0 from dual union all
  select 662.0774, 1100  from dual union all
  select 662.0841, 1100  from dual union all
  select 662.099, 0  from dual)

select min (KMM) as KMMN,
       max (KMM) as KMMK,
       R
from (select KMM,R,
sum(strt_grp) over (order by KMM, R ) grp_num
from (select KMM,R,
case when KMM > 1 + max(KMM) over (order by KMM, R rows between unbounded preceding and 1 preceding) then 1 end strt_grp
from t))
group by grp_num,R
order by KMMN
...
Рейтинг: 0 / 0
Подскажите как реализовать?
    #39771915
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyner81В моем случае у КММ_начала и КММ_конца R=0 и соответственно группируется неправильноНевозможно указать на ошибку в реализации неизвестного алгоритма.
...
Рейтинг: 0 / 0
Подскажите как реализовать?
    #39771929
skyner81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic, чаще всего имеется такая закономерность.
...
Рейтинг: 0 / 0
Подскажите как реализовать?
    #39771934
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyner81Elic, чаще всего имеется такая закономерность.Такие закономерности хорошо обрабатываются match_recognize-ом.

Будешь данные давать фотками - получишь словесное описание запроса. Гуманитарий?
...
Рейтинг: 0 / 0
Подскажите как реализовать?
    #39771937
skyner81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic, также попадаются многорадиусные кривые. Алгоритм такой.
...
Рейтинг: 0 / 0
Подскажите как реализовать?
    #39771943
skyner81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic, так надо?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
with t (KMM, R) as (
  select 662.65, 0 from dual union all
  select 662.774, 1100  from dual union all
  select 662.841, 1100  from dual union all
  select 662.99, 0  from dual union all
  select 663.350, 0  from dual union all  
  select 666.157, 0  from dual union all  
  select 666.234, 690  from dual union all  
  select 667.954, 690  from dual union ALL
  select 668.075, 0  from dual union all  
  select 669.099, 0  from dual union all 
  select 669.110, 800  from dual union all  
  select 669.200, 800  from dual union all    
  select 669.250, 0  from dual union all    
  select 661.060, 0  from dual union all
  select 661.169, 1100  from dual union all
  select 661.534, 1100 from dual union ALL
  select 661.588, 1330 from dual union all
  SELECT 661.640, 1330  from dual union all
  select 661.944, 0  from dual
  )

SELECT * FROM t
...
Рейтинг: 0 / 0
Подскажите как реализовать?
    #39771958
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А обязательно решить именно запросом? Судя по приведенным картинкам, предполагается прохождение всей таблицы однократно. По мне - курсор бы вполне сгодился для этого.

Или есть какие-то сверхкритичные требования по быстродействию?
...
Рейтинг: 0 / 0
Подскажите как реализовать?
    #39771960
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
with d as (
           select 661 km,60 m,0 r from dual union all
           select 661,169,1100 from dual union all
           select 661,534,1100 from dual union all
           select 661,588,1330 from dual union all
           select 661,640,1330 from dual union all
           select 661,944,850 from dual union all
           select 662,324,850 from dual union all
           select 662,427,0 from dual union all
           select 662,650,0 from dual union all
           select 662,774,-1010 from dual union all
           select 662,841,-1010 from dual union all
           select 662,990,0 from dual union all
           select 663,350,0 from dual union all
           select 663,419,0 from dual
          ),
    t1 as (
           select  d.*,
                   case
                     when r = 0 and mod(row_number() over(order by km,m),2) = 1 then 1
                     when r = 0 then 0
                     when lag(r) over(order by km,m) = 0 then 0
                     when lag(r) over(order by km,m) = r then 0
                     else 1
                   end start_of_group,mod(row_number() over(order by km,m),2) x
             from  d
          ),
    t2 as (
           select  t1.*,
                   sum(start_of_group) over(order by km,m) grp
             from  t1
          )
select  case row_number() over(order by grp)
          when 1 then min(km)
          else lag(max(km)) over(order by grp)
        end km_nach,
        case row_number() over(order by grp)
          when 1 then mod(min(km * 1000 + m),1000)
          else lag(mod(max(km * 1000 + m),1000)) over(order by grp)
        end m_nach,
        case mod(max(km * 1000 + m),1000)
          when 0 then max(km) - 1
          else max(km)
        end km_end,
        case mod(max(km * 1000 + m),1000)
          when 0 then 999
          else mod(max(km * 1000 + m),1000) - 1
        end m_end,
        case max(r)
          when 0 then min(r)
          else max(r)
        end r
  from  t2
  group by grp
  having max(abs(r)) != 0
  order by grp
/

   KM_NACH     M_NACH     KM_END      M_END          R
---------- ---------- ---------- ---------- ----------
       661         60        661        533       1100
       661        534        661        639       1330
       661        640        662        426        850
       662        427        662        989      -1010

SQL> 



SY.
...
Рейтинг: 0 / 0
Подскажите как реализовать?
    #39771961
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hе учел впоследней группе вычитать единицу не надо:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
with d as (
           select 661 km,60 m,0 r from dual union all
           select 661,169,1100 from dual union all
           select 661,534,1100 from dual union all
           select 661,588,1330 from dual union all
           select 661,640,1330 from dual union all
           select 661,944,850 from dual union all
           select 662,324,850 from dual union all
           select 662,427,0 from dual union all
           select 662,650,0 from dual union all
           select 662,774,-1010 from dual union all
           select 662,841,-1010 from dual union all
           select 662,990,0 from dual union all
           select 663,350,0 from dual union all
           select 663,419,0 from dual
          ),
    t1 as (
           select  d.*,
                   case
                     when r = 0 and mod(row_number() over(order by km,m),2) = 1 then 1
                     when r = 0 then 0
                     when lag(r) over(order by km,m) = 0 then 0
                     when lag(r) over(order by km,m) = r then 0
                     else 1
                   end start_of_group,mod(row_number() over(order by km,m),2) x
             from  d
          ),
    t2 as (
           select  t1.*,
                   sum(start_of_group) over(order by km,m) grp
             from  t1
          )
select  case row_number() over(order by grp)
          when 1 then min(km)
          else lag(max(km)) over(order by grp)
        end km_nach,
        case row_number() over(order by grp)
          when 1 then mod(min(km * 1000 + m),1000)
          else lag(mod(max(km * 1000 + m),1000)) over(order by grp)
        end m_nach,
        case
          when row_number() over(order by grp desc) = 1 then max(km)
          when mod(max(km * 1000 + m),1000) = 0 then max(km) - 1
          else max(km)
        end km_end,
        case
          when row_number() over(order by grp desc) = 1 then mod(max(km * 1000 + m),1000)
          when mod(max(km * 1000 + m),1000) = 0 then 999
          else mod(max(km * 1000 + m),1000) - 1
        end m_end,
        case max(r)
          when 0 then min(r)
          else max(r)
        end r
  from  t2
  group by grp
  having max(abs(r)) != 0
  order by grp
/

   KM_NACH     M_NACH     KM_END      M_END          R
---------- ---------- ---------- ---------- ----------
       661         60        661        533       1100
       661        534        661        639       1330
       661        640        662        426        850
       662        427        662        990      -1010

SQL> 



SY.
...
Рейтинг: 0 / 0
Подскажите как реализовать?
    #39771962
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не учел продoлжение по km/m идет до r = 0:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
with d as (
           select 661 km,60 m,0 r from dual union all
           select 661,169,1100 from dual union all
           select 661,534,1100 from dual union all
           select 661,588,1330 from dual union all
           select 661,640,1330 from dual union all
           select 661,944,850 from dual union all
           select 662,324,850 from dual union all
           select 662,427,0 from dual union all
           select 662,650,0 from dual union all
           select 662,774,-1010 from dual union all
           select 662,841,-1010 from dual union all
           select 662,990,0 from dual union all
           select 663,350,0 from dual union all
           select 663,419,0 from dual
          ),
    t1 as (
           select  d.*,
                   mod(row_number() over(order by km,m),2) start_of_group,
                   case
                     when r = 0 and mod(row_number() over(order by km,m),2) = 1 then 1
                     when r = 0 then 0
                     when lag(r) over(order by km,m) = 0 then 0
                     when lag(r) over(order by km,m) = r then 0
                     else 1
                   end start_of_subgroup,mod(row_number() over(order by km,m),2) x
             from  d
          ),
    t2 as (
           select  t1.*,
                   sum(start_of_group) over(order by km,m) grp,
                   sum(start_of_subgroup) over(order by km,m) subgrp
             from  t1
          )
select  case row_number() over(partition by max(grp) order by subgrp)
          when 1 then min(km)
          else lag(max(km)) over(order by subgrp)
        end km_nach,
        case row_number() over(partition by max(grp) order by subgrp)
          when 1 then mod(min(km * 1000 + m),1000)
          else lag(mod(max(km * 1000 + m),1000)) over(order by subgrp)
        end m_nach,
        case
          when row_number() over(order by subgrp desc) = 1 then max(km)
          when mod(max(km * 1000 + m),1000) = 0 then max(km) - 1
          else max(km)
        end km_end,
        case
          when row_number() over(order by subgrp desc) = 1 then mod(max(km * 1000 + m),1000)
          when mod(max(km * 1000 + m),1000) = 0 then 999
          else mod(max(km * 1000 + m),1000) - 1
        end m_end,
        case max(r)
          when 0 then min(r)
          else max(r)
        end r
  from  t2
  group by subgrp
  having max(abs(r)) != 0
  order by subgrp
/

   KM_NACH     M_NACH     KM_END      M_END          R
---------- ---------- ---------- ---------- ----------
       661         60        661        533       1100
       661        588        661        639       1330
       661        944        662        426        850
       662        650        662        990      -1010

SQL> 



SY.
...
Рейтинг: 0 / 0
Подскажите как реализовать?
    #39771986
skyner81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY, Спасибо огромное. В последнем варианте вылезли ошибки. Помогите пожалуйста, я без вас не разберусь.

Код: sql
1.
2.
3.
4.
5.
6.
   KM_NACH     M_NACH     KM_END      M_END          R
---------- ---------- ---------- ---------- ----------
       661        60          661        533        1100
       661        588(534)    661        639        1330
       661        944(640)    662        426(427)   850
       662        650         662        990       -1010
...
Рейтинг: 0 / 0
Подскажите как реализовать?
    #39771989
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyner81Помогите пожалуйста, я без вас не разберусь.Нахлебник, думалка не выросла?

Но не расстраивайся сильно.
Соломон из чувства противоречия сломает удочку и насыплет рыбёшки.
Или придёт Станислав и пережуёт всё в гомогенизированную кашицу.
Только ты всё равно останешься "баобабом".
...
Рейтинг: 0 / 0
Подскажите как реализовать?
    #39771993
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
match_recognize(
   order by km,m
   measures
      nvl(r0b.km*1000+r0b.m, prev(first(r1.km))*1000+prev(first(r1.m))) mb,
      nvl(r0e.km*1000+r0e.m, last(r1.km)*1000+last(r1.m)-1) me,
      r1.r as r
   pattern
      (r0b{0,1} r1{2} r0e{0,1})
   define
      r0b as r = 0,
      r0e as r = 0,
      r1 as r <> 0
);

        MB         ME          R
---------- ---------- ----------
    661060     661533       1100
    661534     661639       1330
    661640     662427        850
    662650     662990      -1010
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Подскажите как реализовать?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]