powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Найти не строгую последовательность
6 сообщений из 6, страница 1 из 1
Найти не строгую последовательность
    #39620518
Newber
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, подскажите пожалуйста, как лучше составить запрос на поиск последовательности в данных
есть таблица.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
      select 1 ID,1 RW, 'Второй класс' Class, 5 rate
union select 1 ID,2 RW, 'Третий класс' Class, 1 rate
union select 1 ID,3 RW, 'Четвёртый класс' Class, 2 rate
union select 1 ID,4 RW, 'Пятый класс' Class, 3 rate
union select 2 ID,1 RW, 'Четвёртый класс' Class, 5 rate
union select 2 ID,2 RW, 'Третий класс' Class, 5 rate
union select 2 ID,3 RW, 'Второй класс' Class, 5 rate
union select 3 ID,1 RW, 'Четвёртый класс' Class, 5 rate
union select 3 ID,2 RW, 'Третий класс' Class, 5 rate
union select 4 ID,1 RW, 'Пятый класс' Class, 2 rate
union select 4 ID,2 RW, 'Второй класс' Class, 1 rate
union select 4 ID,3 RW, 'Третий класс' Class, 3 rate
union select 4 ID,4 RW, 'Четвёртый класс' Class, 4 rate
union select 5 ID,1 RW, 'Второй класс' Class, 5 rate
union select 5 ID,2 RW, 'Третий класс' Class, 1 rate
union select 5 ID,3 RW, 'Третий класс' Class, 1 rate
union select 5 ID,4 RW, 'Четвёртый класс' Class, 2 rate
union select 5 ID,5 RW, 'Четвёртый класс' Class, 2 rate
union select 5 ID,6 RW, 'Пятый класс' Class, 3 rate



Нужно найти все ID в которых встречается последовательность: 'Второй класс', 'Четвёртый класс' , 'Пятый класс', именно в таком порядке но не обязательно по порядку и не важны повторы.
То есть в этом примере должно найти ID = 1 и 5
...
Рейтинг: 0 / 0
Найти не строгую последовательность
    #39620573
bdsm_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторименно в таком порядке но не обязательно по порядку
...
Рейтинг: 0 / 0
Найти не строгую последовательность
    #39620577
bdsm_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
при помощи хрустального шара:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select ID from (
  select ID,
    min(case when "Class" = 'Второй класс' then RW end) min_2,
    max(case when "Class" = 'Второй класс' then RW end) max_2,
    min(case when "Class" = 'Четвёртый класс' then RW end) min_4,
    max(case when "Class" = 'Четвёртый класс' then RW end) max_4,
    min(case when "Class" = 'Пятый класс' then RW end) min_5,
    max(case when "Class" = 'Пятый класс' then RW end) max_5
  from tab
  group by ID
) x
where max_5 >= min_5
and min_5 >= max_4
and max_4 >= min_4
and min_4 >= max_2
and max_2 >= min_2
...
Рейтинг: 0 / 0
Найти не строгую последовательность
    #39620884
Newber
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bdsm_sql,

не найдёт вот это:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
union select 6 ID,1 RW, 'Четвёртый класс' Class, 2 rate
union select 6 ID,2 RW, 'Второй класс' Class, 5 rate
union select 6 ID,3 RW, 'Третий класс' Class, 1 rate
union select 6 ID,4 RW, 'Третий класс' Class, 1 rate
union select 6 ID,5 RW, 'Четвёртый класс' Class, 2 rate
union select 6 ID,6 RW, 'Четвёртый класс' Class, 2 rate
union select 6 ID,7 RW, 'Пятый класс' Class, 3 rate 
union select 6 ID,8 RW, 'Четвёртый класс' Class, 2 rate
...
Рейтинг: 0 / 0
Найти не строгую последовательность
    #39620930
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Newber,

если лениво, и плотность искомого примерно как у вас --
Код: sql
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.
WITH t(id,rw,"class",rate )as (values
 (1 ,1 , 'Второй класс' , 5 )
,( 1 ,2 , 'Третий класс' , 1 )
,( 1 ,3 , 'Четвёртый класс' , 2 )
,( 1 ,4 , 'Пятый класс' , 3 )
,( 2 ,1 , 'Четвёртый класс' , 5 )
,( 2 ,2 , 'Третий класс' , 5 )
,( 2 ,3 , 'Второй класс' , 5 )
,( 3 ,1 , 'Четвёртый класс' , 5 )
,( 3 ,2 , 'Третий класс' , 5 )
,( 4 ,1 , 'Пятый класс' , 2 )
,( 4 ,2 , 'Второй класс' , 1 )
,( 4 ,3 , 'Третий класс' , 3 )
,( 4 ,4 , 'Четвёртый класс' , 4 )
,( 5 ,1 , 'Второй класс' , 5 )
,( 5 ,2 , 'Третий класс' , 1 )
,( 5 ,3 , 'Третий класс' , 1 )
,( 5 ,4 , 'Четвёртый класс' , 2 )
,( 5 ,5 , 'Четвёртый класс' , 2 )
,( 5 ,6 , 'Пятый класс' , 3 )
)
,t2 as (select * from t 
union all  select 6 ID,1 RW, 'Четвёртый класс' "class", 2 rate
union all  select 6 ID,2 RW, 'Второй класс' "class", 5 rate
union all  select 6 ID,3 RW, 'Третий класс' "class", 1 rate
union all  select 6 ID,4 RW, 'Третий класс' "class", 1 rate
union all  select 6 ID,5 RW, 'Четвёртый класс' "class", 2 rate
union all  select 6 ID,6 RW, 'Четвёртый класс' "class", 2 rate
union all  select 6 ID,7 RW, 'Пятый класс' "class", 3 rate 
union all  select 6 ID,8 RW, 'Четвёртый класс' "class", 2 rate
)
,t3 as (SELECT * 
, case "class" 
when '1' then 1
WHEN  'Второй класс' then 2
when 'Третий класс' then 3
when 'Четвёртый класс' then 4
when 'Пятый класс' then 5
when '6' then 6 
end AS classi 
from t2
) -- add short classi
select id, array_agg(rw order by id,rw), string_agg(trim(classi::text),''  order by id,rw) classes
from t3
group by id
having /*classes*/ string_agg(trim(classi::text),''  order by id,rw) ~* '2+[^245]*4+[^245]*5+'



если плотность искомого доли процентов -- то через exsists(... where [not] exists )
...
Рейтинг: 0 / 0
Найти не строгую последовательность
    #39621094
bdsm_sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или так, чтобы сначало отфильтровать лишне и схлопнуть дубли (можно на with переписать, мне было лень)
Код: 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.
select
  x.ID
from (
  select
    x.ID,
    min(x.RW) RW,
    min(x.cl) cl
  from (
    select
      x.ID,
      x.RW,
      x.cl,
      sum(x.f) over(partition by x.ID order by x.RW) g
    from (
      select
        x.ID,
        x.RW,
        x.cl,
        case when lag(x.cl) over(partition by x.ID order by x.RW) = x.cl then 0 else 1 end f
      from (
        select
          t.ID,
          t.RW,
          case t."Class" when 'Второй класс' then '2' when 'Четвёртый класс' then '4' when 'Пятый класс' then '5' end cl
        from tab t
        where t."Class" in ('Второй класс', 'Четвёртый класс', 'Пятый класс')
      ) x
    ) x
  ) x
  group by x.ID, x.g
) x
group by x.ID
having string_agg(x.cl, '' order by x.RW) like '%245%'
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Найти не строгую последовательность
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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