powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите получить количество записей за каждые N минут
11 сообщений из 11, страница 1 из 1
Помогите получить количество записей за каждые N минут
    #40033780
vv388
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как получить количество записей в таблице за каждые N минут.

Допустим есть набор данных:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
2021-01-06 00:00:00.407
2021-01-06 00:00:03.313
2021-01-06 00:30:00.310
2021-01-06 00:30:02.873
2021-01-06 01:00:00.413
2021-01-06 01:00:03.287
2021-01-06 01:30:00.307
2021-01-06 01:30:02.893
2021-01-06 02:00:00.470
2021-01-06 02:00:03.210
2021-01-06 02:30:00.313
2021-01-06 02:30:02.843


Например:
1. получить количество записей за каждые 10 минут, то ответ должен быть таким:
00:10 - 2
00:20 - 0
00:30 - 2
00:40 - 0
00:50 - 0
01:00 - 0
01:10 - 2
и т.д.

2. получить количество записей за каждые 30 минут, то ответ должен быть таким:
00:30 - 4
01:00 - 0
01:30 - 4
02:00 - 0
02:00 - 4
...
Рейтинг: 0 / 0
Помогите получить количество записей за каждые N минут
    #40033792
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vv388
2. получить количество записей за каждые 30 минут, то ответ должен быть таким:
00:30 - 4
01:00 - 0

vv388
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
2021-01-06 00:00:00.407
2021-01-06 00:00:03.313
2021-01-06 00:30:00.310
2021-01-06 00:30:02.873
2021-01-06 01:00:00.413
2021-01-06 01:00:03.287
2021-01-06 01:30:00.307
2021-01-06 01:30:02.893
2021-01-06 02:00:00.470
2021-01-06 02:00:03.210
2021-01-06 02:30:00.313
2021-01-06 02:30:02.843


ащето, 30-ая минута заканчивается в 2021-01-06 00:30:00.000

в интервал 0:30-1:00 ты ж, почему-то, эти 2-е записи не включил ...
vv388
Код: sql
1.
2.
2021-01-06 01:00:00.413
2021-01-06 01:00:03.287

...
Рейтинг: 0 / 0
Помогите получить количество записей за каждые N минут
    #40033793
Фотография 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.
declare @minute_interval integer = 30

declare @t table (dt datetime)

insert into @t values
('2021-01-06 00:00:00.407'),
('2021-01-06 00:00:03.313'),
('2021-01-06 00:30:00.310'),
('2021-01-06 00:30:02.873'),
('2021-01-06 01:00:00.413'),
('2021-01-06 01:00:03.287'),
('2021-01-06 01:30:00.307'),
('2021-01-06 01:30:02.893'),
('2021-01-06 02:00:00.470'),
('2021-01-06 02:00:03.210'),
('2021-01-06 02:30:00.313'),
('2021-01-06 02:30:02.843')

select  
	dateadd(minute, (v.number+1) * @minute_interval, '2021-01-06') as interval
	,count(d.dt) as cnt
from master..spt_values v
outer apply (select t.dt from @t t where t.dt > dateadd(minute, v.number * @minute_interval, '2021-01-06') and t.dt <= dateadd(minute, (v.number+1) * @minute_interval, '2021-01-06')) d
where v.type = 'P' and v.number < 24*60 / @minute_interval
group by
	dateadd(minute, (v.number+1) * @minute_interval, '2021-01-06')
order by 1


intervalcnt2021-06-01 00:30:00.00022021-06-01 01:00:00.00022021-06-01 01:30:00.00022021-06-01 02:00:00.00022021-06-01 02:30:00.00022021-06-01 03:00:00.00022021-06-01 03:30:00.0000......
...
Рейтинг: 0 / 0
Помогите получить количество записей за каждые N минут
    #40033794
vv388
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
court,
Да. Там ошибся. Диапазоны должны быть 00 - 10.00; 10.01 -20.00; 20.01 - 30.00 ......
...
Рейтинг: 0 / 0
Помогите получить количество записей за каждые N минут
    #40033820
vv388
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
court,
В пределах 1 дня работает, а если надо будет за месяц?
...
Рейтинг: 0 / 0
Помогите получить количество записей за каждые N минут
    #40033825
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vv388
court,
В пределах 1 дня работает, а если надо будет за месяц?
напишешь инлайн-функцию с параметром "дата для которой разбиение" и будешь банкувать
...
Рейтинг: 0 / 0
Помогите получить количество записей за каждые N минут
    #40033842
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vv388
court,
В пределах 1 дня работает, а если надо будет за месяц?
Добавляем в гроуп бай дату.
...
Рейтинг: 0 / 0
Помогите получить количество записей за каждые N минут
    #40033845
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vv388
а если надо будет за месяц?
Код: 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.
declare @m int = 30, @date_start datetime = '20210106', @date_end datetime = '20210107';

declare @t table (dt datetime)

insert into @t values
('2021-01-06 00:00:00.407'),
('2021-01-06 00:00:03.313'),
('2021-01-06 00:30:00.310'),
('2021-01-06 00:30:02.873'),
('2021-01-06 01:00:00.413'),
('2021-01-06 01:00:03.287'),
('2021-01-06 01:30:00.307'),
('2021-01-06 01:30:02.893'),
('2021-01-06 02:00:00.470'),
('2021-01-06 02:00:03.210'),
('2021-01-06 02:30:00.313'),
('2021-01-06 02:30:02.843');

with s (dt) as
(
 select top (datediff(minute, @date_start, @date_end) / @m)
  dateadd(minute, (row_number() over (order by 1/0)) * @m, @date_start)
 from
  master.dbo.spt_values cross join
  master.dbo.spt_values b
)
select
 s.dt, count(t.dt)
from
 s left join
 @t t on s.dt = dateadd(minute, @m * (datediff(minute, '1900', t.dt) / @m), '1900')
group by
 s.dt
order by
 s.dt;
...
Рейтинг: 0 / 0
Помогите получить количество записей за каждые N минут
    #40036533
osipen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как вариант так:
Код: 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.
declare @t table ( dt datetime )


insert into @t
values ( '2021-01-06 00:00:00.407' )
,      ( '2021-01-06 00:00:03.313' )
,      ( '2021-01-06 00:30:00.310' )
,      ( '2021-01-06 00:30:02.873' )
,      ( '2021-01-06 01:00:00.413' )
,      ( '2021-01-06 01:00:03.287' )
,      ( '2021-01-06 01:30:00.307' )
,      ( '2021-01-06 01:30:02.893' )
,      ( '2021-01-06 02:00:00.470' )
,      ( '2021-01-06 02:00:03.210' )
,      ( '2021-01-06 02:30:00.313' )
,      ( '2021-01-06 02:30:02.843' );

 

;with s
as
(
       select cast('2021-01-06 00:00:00.000' as datetime) dt_st
       ,      cast('2021-01-06 00:30:00.000' as datetime) dt_lag
       ,      cast('2021-01-06 05:30:00.000' as datetime) dt_max
       --from @t
       union all
       select dateadd(MINUTE,+30,dt_st)
       ,      dateadd(MINUTE,+30,dt_lag)
       ,      dt_max
       from s
       where dt_st<=dt_max

)

select s.dt_st
,      s.dt_lag
,      COUNT(t.dt)
from      s  
full join @t t on t.dt between s.dt_st and s.dt_lag
group by s.dt_st
,        s.dt_lag
...
Рейтинг: 0 / 0
Помогите получить количество записей за каждые N минут
    #40036547
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
osipen
Код: sql
1.
cast('2021-01-06 00:00:00.000' as datetime)

Это 6 января или 1 июня?
...
Рейтинг: 0 / 0
Помогите получить количество записей за каждые N минут
    #40036549
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
osipen,

писать надо так:
2021-01-06T00:00:00.407
или так:
20210106 00:00:00.407

иначе заложите мину замедленного действия:
Код: sql
1.
2.
3.
4.
set language english
select CAST('2021-01-06 00:00:00.407' as datetime)
set language russian
select CAST('2021-01-06 00:00:00.407' as datetime)
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите получить количество записей за каждые N минут
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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