powered by simpleCommunicator - 2.0.18     © 2024 Programmizd 02
Map
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Счетчик последовательности значений
12 сообщений из 12, страница 1 из 1
Счетчик последовательности значений
    #40134056
IronMike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!

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

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

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

можете чуть подробнее?)
...
Рейтинг: 0 / 0
Счетчик последовательности значений
    #40134059
...
Рейтинг: 0 / 0
Счетчик последовательности значений
    #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
Счетчик последовательности значений
    #40134064
IronMike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
бабушкин зайчик,
спасибо!
...
Рейтинг: 0 / 0
Счетчик последовательности значений
    #40134066
IronMike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
court,
супер, спасибо большое! получилось)
...
Рейтинг: 0 / 0
Счетчик последовательности значений
    #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
Счетчик последовательности значений
    #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
Счетчик последовательности значений
    #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
Счетчик последовательности значений
    #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
Счетчик последовательности значений
    #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
12 сообщений из 12, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Счетчик последовательности значений
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (1): Анонимы (1)
Пользователи онлайн (6): Анонимы (4), Bing Bot 1 мин., Yandex Bot 4 мин.
x
x
Закрыть


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