Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Превратить из python-алгоритма в SQL / 8 сообщений из 8, страница 1 из 1
28.10.2021, 14:21
    #40107742
sysn1k
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Превратить из python-алгоритма в SQL
Здравствуйте!
Решил задание на 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
28.10.2021, 14:31
    #40107746
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Превратить из python-алгоритма в SQL
авторпредставлена таблица table с данными о неких событиях, имеющих продолжительность, ограниченную значениями start и stop.
значения start и stop абсолютно независимы. единственное ограничение - у одной записи stop > start.
необходимо разделить все записи на блоки и присвоить каждой строке значение-номер блока, который ей соответствует.
блок - это набор строк, которые пересекаются по продолжительности с любым другим значением данного блока.

1. Начала блоков = все start, которые НЕ попадают НИ в один интервал, кроме своего.
2. Концы блоков = все stop, которые НЕ попадают НИ в один интервал, кроме своего.
3. Начал ровно столько же, сколько концов.
4. Далее фсе тривиально.
...
Рейтинг: 0 / 0
28.10.2021, 14:59
    #40107755
Oleg_SQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Превратить из python-алгоритма в 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
28.10.2021, 15:14
    #40107758
Oleg_SQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Превратить из python-алгоритма в SQL
Но данные должны быть упорядочены по start, stop (Id возрастает по этому условию).
Иначе нужно делать вычисляемый Id по этому условию
...
Рейтинг: 0 / 0
28.10.2021, 16:18
    #40107792
sysn1k
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Превратить из python-алгоритма в SQL
Oleg_SQL,

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

Код: 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
28.10.2021, 20:03
    #40107862
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Превратить из python-алгоритма в SQL
...
Рейтинг: 0 / 0
28.10.2021, 20:25
    #40107863
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Превратить из python-алгоритма в SQL
Код: 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
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Превратить из python-алгоритма в SQL / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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