Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Счетчик последовательности значений / 12 сообщений из 12, страница 1 из 1
14.02.2022, 18:36
    #40134056
IronMike
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Счетчик последовательности значений
Всем привет!

Подскажите, как реализовать такое.
У меня есть последовательность 0 и 1 (колонка posl).
Мне надо последовательно нумеровать каждый ряд 1 (см прикрепленную картинку, поле "Результат").

Как такое реализовать?

Заранее спасибо!
...
Рейтинг: 0 / 0
14.02.2022, 18:39
    #40134057
Счетчик последовательности значений
serial?
...
Рейтинг: 0 / 0
14.02.2022, 18:42
    #40134058
IronMike
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Счетчик последовательности значений
бабушкин зайчик,

можете чуть подробнее?)
...
Рейтинг: 0 / 0
14.02.2022, 18:43
    #40134059
Счетчик последовательности значений
...
Рейтинг: 0 / 0
14.02.2022, 18:49
    #40134061
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Счетчик последовательности значений
IronMike,

Код: 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.
with cte (id, posl) as (
    select 1 ,0 union all
    select 2 ,0 union all
    select 3 ,0 union all
    select 4 ,1 union all
    select 5 ,0 union all
    select 6 ,1 union all
    select 7 ,1 union all
    select 8 ,1 union all
    select 9 ,0 union all
    select 10 ,0 union all
    select 11 ,1 union all
    select 12 ,1
),
cte1 as (
    select 
        id
        ,posl 
        ,row_number()over(order by id) - row_number()over(partition by posl order by id) as inv
    from cte
)
select
	id
    ,posl
    ,case when posl = 1 then dense_rank()over(partition by posl order by inv) else 0 end as res
from cte1     
order by id


idposlres100200300411500612712812900100011131213
...
Рейтинг: 0 / 0
14.02.2022, 19:05
    #40134064
IronMike
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Счетчик последовательности значений
бабушкин зайчик,
спасибо!
...
Рейтинг: 0 / 0
14.02.2022, 19:05
    #40134066
IronMike
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Счетчик последовательности значений
court,
супер, спасибо большое! получилось)
...
Рейтинг: 0 / 0
17.02.2022, 00:39
    #40134689
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Счетчик последовательности значений
court,
Я бы скорее вот так вот сделал (оно проще, быстрее и понятнее что делает):

Код: 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.
with cte (id, posl) as (
    select 1 ,0 union all
    select 2 ,0 union all
    select 3 ,0 union all
    select 4 ,1 union all
    select 5 ,0 union all
    select 6 ,1 union all
    select 7 ,1 union all
    select 8 ,1 union all
    select 9 ,0 union all
    select 10 ,0 union all
    select 11 ,1 union all
    select 12 ,1
),
prev_val AS (
SELECT id, posl, lag(posl) OVER (ORDER BY id) AS prev_posl FROM cte
)
select id, posl, CASE WHEN posl=0 THEN 0 ELSE sum(CASE WHEN (posl=1 AND prev_posl=0) THEN 1 ELSE 0 END) OVER (ORDER BY id) END AS res
FROM prev_val ORDER BY id;
 id | posl | res 
----+------+-----
  1 |    0 |   0
  2 |    0 |   0
  3 |    0 |   0
  4 |    1 |   1
  5 |    0 |   0
  6 |    1 |   2
  7 |    1 |   2
  8 |    1 |   2
  9 |    0 |   0
 10 |    0 |   0
 11 |    1 |   3
 12 |    1 |   3
(12 rows)



--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
17.02.2022, 12:16
    #40134755
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Счетчик последовательности значений
Maxim Boguk
court,
Я бы скорее вот так вот сделал (оно проще, быстрее и понятнее что делает):
на счет понятнее, - согласен
только нужно как-то обрабатывать ещё такую ситуацию (код), так как в этом случае отрабатывает не верно
мой запрос, через инвариант, с этим справляется без изменений
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
with cte (id, posl) as (
    select 1 ,1 union all
    select 2 ,0 union all
    select 3 ,0 union all
    select 4 ,1 union all
    select 5 ,0 union all
    select 6 ,1 union all
    select 7 ,1 union all
    select 8 ,1 union all
    select 9 ,0 union all
    select 10 ,0 union all
    select 11 ,1 union all
    select 12 ,1
),
prev_val AS (
SELECT id, posl, lag(posl) OVER (ORDER BY id) AS prev_posl FROM cte
)
select id, posl, CASE WHEN posl=0 THEN 0 ELSE sum(CASE WHEN (posl=1 AND prev_posl=0) THEN 1 ELSE 0 END) OVER (ORDER BY id) END AS res
FROM prev_val ORDER BY id;


idposlres11 0 200300411500612712812900100011131213
...
Рейтинг: 0 / 0
17.02.2022, 12:19
    #40134756
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Счетчик последовательности значений
court
только нужно как-то обрабатывать ещё такую ситуацию (код), так как в этом случае отрабатывает не верно
вообщем, там всего изменений, что coalesce добавить ...

Код: sql
1.
2.
3.
4.
5.
prev_val AS (
SELECT id, posl, coalesce(lag(posl) OVER (ORDER BY id),0) AS prev_posl FROM cte
)
select id, posl, CASE WHEN posl=0 THEN 0 ELSE sum(CASE WHEN (posl=1 AND prev_posl=0) THEN 1 ELSE 0 END) OVER (ORDER BY id) END AS res
FROM prev_val ORDER BY id;
...
Рейтинг: 0 / 0
17.02.2022, 13:07
    #40134777
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Счетчик последовательности значений
court
court
только нужно как-то обрабатывать ещё такую ситуацию (код), так как в этом случае отрабатывает не верно
вообщем, там всего изменений, что coalesce добавить ...

Код: sql
1.
2.
3.
4.
5.
prev_val AS (
SELECT id, posl, coalesce(lag(posl) OVER (ORDER BY id),0) AS prev_posl FROM cte
)
select id, posl, CASE WHEN posl=0 THEN 0 ELSE sum(CASE WHEN (posl=1 AND prev_posl=0) THEN 1 ELSE 0 END) OVER (ORDER BY id) END AS res
FROM prev_val ORDER BY id;



Да вариант стартовой единицы я не учёл. +1

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
17.02.2022, 18:34
    #40134940
vyegorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Счетчик последовательности значений
court
court
только нужно как-то обрабатывать ещё такую ситуацию (код), так как в этом случае отрабатывает не верно
вообщем, там всего изменений, что coalesce добавить ...

Код: sql
1.
2.
3.
4.
5.
prev_val AS (
SELECT id, posl, coalesce(lag(posl) OVER (ORDER BY id),0) AS prev_posl FROM cte
)
select id, posl, CASE WHEN posl=0 THEN 0 ELSE sum(CASE WHEN (posl=1 AND prev_posl=0) THEN 1 ELSE 0 END) OVER (ORDER BY id) END AS res
FROM prev_val ORDER BY id;



или просто …lag(posl,1,0) OVER (ORDER BY id)… вместо coalesce.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Счетчик последовательности значений / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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