Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Расчет времени для одинаковых повторяющихся значений. / 4 сообщений из 4, страница 1 из 1
10.02.2022, 00:54
    #40132980
kosta_2073
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет времени для одинаковых повторяющихся значений.
Добрый день.
Никак не могу сообразить скул.
есть таблица
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
id	t_id	              created	                         delta
500	11	          2017-06-27 13:38:32.013	0,0470344570255873
570	11	          2017-06-27 13:48:32.013	0,0470344570255873
579	11	          2017-06-27 13:49:52.293	0	
580	11	          2017-06-27 13:55:52.293	0	
583	11	          2017-06-27 13:59:52.293	0	
585	11	          2017-06-27 14:14:28.517	0	
590	11	          2017-06-27 14:15:17.917	0,052557428765052	
.......
......
619	11	          2017-07-21 11:01:13.030	0,00363766061013005	
659	11	          2017-07-21 11:11:13.030	0,00363766061013005	
670	11	          2017-07-21 11:12:13.803	0	
689	11	          2017-07-21 11:12:22.160	0	
700	11	          2017-07-21 11:12:27.907	0,000234218941076596



надо получить таблу в которой начало события - последний не ноль перед "группой 0", конец - последний 0 в "группе 0"
т.е. вот так:
Код: sql
1.
2.
3.
   t_id     start                                         end             start_id   end_id
   11	   2017-06-27 13:48:32.013	    2017-06-27 14:14:28.517       570          585
   11      2017-07-21 11:11:13.030          2017-07-21 11:12:22.160       659          689



start_id и end_id - для простоты понимания .

заранее спасибо.
...
Рейтинг: 0 / 0
10.02.2022, 05:50
    #40132994
3unknown
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет времени для одинаковых повторяющихся значений.
Код: 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.
DROP TABLE IF EXISTS #data;
CREATE TABLE #data (
  [id]    INT,
  [t_id] int,
  [created] datetime,
  delta float
)
;

insert #data
values(500,11,'2017-06-27 13:38:32.013',0.0470344570255873),
(570,11,'2017-06-27 13:48:32.013',	0.0470344570255873),
(579,11,'2017-06-27 13:49:52.293',	0),	
(580,11,'2017-06-27 13:55:52.293',	0),	
(583,11,'2017-06-27 13:59:52.293',	0),
(585,11,'2017-06-27 14:14:28.517',	0),	
(590,11,'2017-06-27 14:15:17.917',	0.052557428765052),	
(519,11,'2017-07-21 11:01:13.030', 0.00363766061013005),
(659,11,'2017-07-21 11:11:13.030',	0.00363766061013005),
(670,11,'2017-07-21 11:12:13.803',	0),	
(689,11,'2017-07-21 11:12:22.160',	0),
(700,11,'2017-07-21 11:12:27.907',0.000234218941076596)

;with a as(
select  * 
,case when lead(delta) over(order by created) = 0 or delta = 0 then 1 else 0 end n
from #data
)
,b as(
select*,
case when n <> lead(n) over(order by created) then 1 else 0 end f
from a
)
,c as(
select *,
sum(f) over(order by created) s,
sum(f) over(order by created) - f g
from b
)
select min(created) as start_date,max(created) as end_date,min(id) as start_id,max(id) as end_id
from c
where n=1
group by g
...
Рейтинг: 0 / 0
10.02.2022, 06:11
    #40132995
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет времени для одинаковых повторяющихся значений.
3unknown
Код: 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.
DROP TABLE IF EXISTS #data;
CREATE TABLE #data (
  [id]    INT,
  [t_id] int,
  [created] datetime,
  delta float
)
;

insert #data
values(500,11,'2017-06-27 13:38:32.013',0.0470344570255873),
(570,11,'2017-06-27 13:48:32.013',	0.0470344570255873),
(579,11,'2017-06-27 13:49:52.293',	0),	
(580,11,'2017-06-27 13:55:52.293',	0),	
(583,11,'2017-06-27 13:59:52.293',	0),
(585,11,'2017-06-27 14:14:28.517',	0),	
(590,11,'2017-06-27 14:15:17.917',	0.052557428765052),	
(519,11,'2017-07-21 11:01:13.030', 0.00363766061013005),
(659,11,'2017-07-21 11:11:13.030',	0.00363766061013005),
(670,11,'2017-07-21 11:12:13.803',	0),	
(689,11,'2017-07-21 11:12:22.160',	0),
(700,11,'2017-07-21 11:12:27.907',0.000234218941076596)

;with a as(
select  * 
,case when lead(delta) over(order by created) = 0 or delta = 0 then 1 else 0 end n
from #data
)
,b as(
select*,
case when n <> lead(n) over(order by created) then 1 else 0 end f
from a
)
,c as(
select *,
sum(f) over(order by created) s,
sum(f) over(order by created) - f g
from b
)
select min(created) as start_date,max(created) as end_date,min(id) as start_id,max(id) as end_id
from c
where n=1
group by g


Бред.
Зачем в этом бреде напрягать сервер группировками?

Учись, студент

Код: sql
1.
2.
3.
4.
5.
with t as ( select *, leadDelta = lead(delta) over(partition by t_id order by [created]), lagDelta = lag(delta) over(partition by t_id order by [created]) from #data )
   , b as ( select *, n = row_number() over(partition by t_id order by [created]) from t where delta <> 0 and leadDelta = 0 )
   , e as ( select *, n = row_number() over(partition by t_id order by [created]) from t where delta = 0 and leadDelta <> 0 )
  select * from b inner join e on b.t_id = e.t_id and b.n = e.n
    order by b.created
...
Рейтинг: 0 / 0
10.02.2022, 10:37
    #40133039
kosta_2073
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Расчет времени для одинаковых повторяющихся значений.
громадное спасибо буду пробовать.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Расчет времени для одинаковых повторяющихся значений. / 4 сообщений из 4, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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