powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Превратить из python-алгоритма в SQL
8 сообщений из 8, страница 1 из 1
Превратить из python-алгоритма в SQL
    #40107742
sysn1k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Решил задание на Python (задание, код в файле).
Попросили решить эту задачу в SQL (сразу предупредили, что сложнее будет). Не получается.
Пытался через декларирование переменных, не получилось. Попробовал через lag/led - тоже не удается.
Подскажите, как выйти к правильному решению.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
declare @max_stop int
DECLARE @block_num INT
set @max_stop = 0
set @block_num = 1
BEGIN
with test as(
select 1 as id, 1 as start, 2 as stop
UNION all select 2 as id, 1 as start, 3 as stop
UNION all select 3 as id, 2 as start, 3 as stop
UNION all select 4 as id, 10 as start, 14 as stop
UNION all select 5 as id, 11 as start, 13 as stop
UNION all select 6 as id, 14 as start, 15 as stop
),
b as (select *,lag(stop) over(order by id)  as prev_value_stop
from test
), 
c as (
select id, start, case when prev_value_stop < start then stop else prev_value_stop end prev_value_stop
from b)
select *,lag(prev_value_stop) over(order by id)  as prev
from c 

end
...
Рейтинг: 0 / 0
Превратить из python-алгоритма в SQL
    #40107746
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторпредставлена таблица table с данными о неких событиях, имеющих продолжительность, ограниченную значениями start и stop.
значения start и stop абсолютно независимы. единственное ограничение - у одной записи stop > start.
необходимо разделить все записи на блоки и присвоить каждой строке значение-номер блока, который ей соответствует.
блок - это набор строк, которые пересекаются по продолжительности с любым другим значением данного блока.

1. Начала блоков = все start, которые НЕ попадают НИ в один интервал, кроме своего.
2. Концы блоков = все stop, которые НЕ попадают НИ в один интервал, кроме своего.
3. Начал ровно столько же, сколько концов.
4. Далее фсе тривиально.
...
Рейтинг: 0 / 0
Превратить из python-алгоритма в SQL
    #40107755
Oleg_SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sysn1k,

оно?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
;WITH 
test AS (
	SELECT 1 AS id, 1 AS start, 2 AS stop
	UNION ALL
	SELECT 2 AS id, 1 AS start, 3 AS stop
	UNION ALL
	SELECT 3 AS id, 2 AS start, 3 AS stop
	UNION ALL
	SELECT 4 AS id, 10 AS start, 14 AS stop
	UNION ALL
	SELECT 5 AS id, 11 AS start, 13 AS stop
	UNION ALL
	SELECT 6 AS id, 14 AS start, 15 AS stop
),
src AS (
SELECT a.*, isnull(c.id2, a.id) id2
  FROM test a
       OUTER APPLY (SELECT b.id id2 FROM test b WHERE a.start <= b.stop AND a.stop >= b.start AND a.id < b.id) c
)
SELECT DISTINCT a.Id, a.start, a.stop, DENSE_RANK() OVER(ORDER BY b.Id3) AS block_num
  FROM src a
       OUTER APPLY (SELECT MIN(id) id3 FROM src b WHERE b.Id2 = a.Id2) b
...
Рейтинг: 0 / 0
Превратить из python-алгоритма в SQL
    #40107758
Oleg_SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Но данные должны быть упорядочены по start, stop (Id возрастает по этому условию).
Иначе нужно делать вычисляемый Id по этому условию
...
Рейтинг: 0 / 0
Превратить из python-алгоритма в SQL
    #40107792
sysn1k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Oleg_SQL,

ответ сходится, но не сильно понимаю, что вы сделали)
...
Рейтинг: 0 / 0
Превратить из python-алгоритма в SQL
    #40107855
sysn1k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Свое решение. Че-то получилось.

Код: 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 
test AS (
	SELECT 1 AS id, 1 AS start, 2 AS stop
	UNION ALL
	SELECT 2 AS id, 1 AS start, 3 AS stop
	UNION ALL
	SELECT 3 AS id, 2 AS start, 3 AS stop
	UNION ALL
	SELECT 4 AS id, 10 AS start, 14 AS stop
	UNION ALL
	SELECT 5 AS id, 11 AS start, 13 AS stop
	UNION ALL
	SELECT 6 AS id, 14 AS start, 15 AS stop
),
    a as (
    select *, lag(stop) over(order by id) stop2
    from test),

    b as(
    select id,start, 
      		case 
      			when stop2 is null then stop 
      			when start > stop2 then stop else stop2 
      		end stop3
    from a
    ),

    c as(
    select *,  case when lag(stop3) over(order by id) >= start then 0 else 1 end block_num_check
    from b)
    
select id, start, stop3, sum(block_num_check) over(order by id) block_num
from c 
 
...
Рейтинг: 0 / 0
Превратить из python-алгоритма в SQL
    #40107862
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Превратить из python-алгоритма в SQL
    #40107863
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
with test as(
select 1 as id, 1 as start, 2 as stop
UNION all select 2 as id, 1 as start, 3 as stop
UNION all select 3 as id, 2 as start, 3 as stop
UNION all select 4 as id, 10 as start, 14 as stop
UNION all select 5 as id, 11 as start, 13 as stop
UNION all select 6 as id, 14 as start, 15 as stop
),
a as
(
 select
  *,
  max(stop) over (order by start rows between unbounded preceding and 1 preceding) as stop_prev_max
 from
  test
)
select
 id, start, stop,
 sum(case when start > stop_prev_max then 1 else 0 end) over (order by start) as g
from
 a
order by
 id;
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Превратить из python-алгоритма в SQL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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