Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
TsHeloWorlder Member Откуда: Сообщений: 139 |
Помогите пожалуйста с запросом. Звучит очень просто, но как подступится к нему не пойму. Имеется таблица с данными такого формата:
Нужно разбить каждый день на отрезки в 30 минут и для каждого дня посчитать количество строк с данными. Т.е. чтобы в итоге было так:
Примерный шаги запроса понимаю: - сгенерировать получасовые отрезки в рамках одного дня - заджоинить таблицу с данными разбив по получасовым отрезкам - ну и сгруппировать по count() но вот написать SQL не могу, идей нет. Хэлп плиз. |
|||||||||||||||||||||||||||||||||||||||
12 июл 17, 13:52 [20636954] Ответить | Цитировать Сообщить модератору |
msLex Member Откуда: Сообщений: 8723 |
на каком из этапов возникла проблема? |
||
12 июл 17, 13:54 [20636964] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
|
||||
12 июл 17, 13:57 [20636983] Ответить | Цитировать Сообщить модератору |
TsHeloWorlder Member Откуда: Сообщений: 139 |
msLex, на первом. и потом скорее всего на втором будут - нужно будет джоинить согласно отрезкам. думаю только с последним этапом проблем не будет )) вообще я редко пишу запросы, Entity Framework отучает от этого дела :( Отвык уже на чистом SQL писать и когда такие нестандартные задачи возникают, задумываюсь. |
12 июл 17, 14:03 [20637020] Ответить | Цитировать Сообщить модератору |
msLex Member Откуда: Сообщений: 8723 |
два ваших первых шага можно заменить на "округление" времени до получаса dateadd(mi, datediff(mi, 0, datetimefield) / 30 *30, 0) и уже относительно него группировать |
12 июл 17, 14:19 [20637094] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47051 |
|
||
12 июл 17, 14:44 [20637208] Ответить | Цитировать Сообщить модератору |
msLex Member Откуда: Сообщений: 8723 |
да, на count = 0 не обратил внимания |
||||
12 июл 17, 14:49 [20637223] Ответить | Цитировать Сообщить модератору |
MyNiGoo Member Откуда: Сообщений: 234 |
очевидно, нужна таблица-циферблат со значениями от 00:00 до 23:59 |
12 июл 17, 15:16 [20637387] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
омг, уже ответили давно
какой ещё циферблат, табло и тд... |
||||
12 июл 17, 15:18 [20637396] Ответить | Цитировать Сообщить модератору |
Massa52 Member Откуда: Сообщений: 382 |
TsHeloWorlder,
|
|
12 июл 17, 15:26 [20637437] Ответить | Цитировать Сообщить модератору |
SQL2008 Member Откуда: Москва Сообщений: 4400 |
Есть нетривиальное решение Помня о том, что при конвертации даты в флоат время находится в дробной части числа declare @half float = 0.0208333333357587; ((select count(1) from t where CAST([DateTime] as float) - CAST([DateTime] as int) >= 0 and CAST([DateTime] as float) - CAST([DateTime] as int) < @half) as [00-30], ((select count(1) from t where CAST([DateTime] as float) - CAST([DateTime] as int) >= @half and CAST([DateTime] as float) - CAST([DateTime] as int) < 2*@half) as [01-00], ((select count(1) from t where CAST([DateTime] as float) - CAST([DateTime] as int) >= 2*@half and CAST([DateTime] as float) - CAST([DateTime] as int) < 3*@half) as [01-30], ... ((select count(1) from t where CAST([DateTime] as float) - CAST([DateTime] as int) >=46*@half and CAST([DateTime] as float) - CAST([DateTime] as int) <47*@half) as [23-30] Надеюсь принцип понятен. Хотя в будущем может перестать работать. При желании можно оптимизировать, загнать в CTE, сделать проще. |
12 июл 17, 15:45 [20637514] Ответить | Цитировать Сообщить модератору |
msLex Member Откуда: Сообщений: 8723 |
![]() ![]() ![]() |
||
12 июл 17, 15:48 [20637525] Ответить | Цитировать Сообщить модератору |
TsHeloWorlder Member Откуда: Сообщений: 139 |
Massa52, Спасибо ! |
12 июл 17, 15:53 [20637553] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
Massa52, если уже генерируете таблицу, то почему сразу не получать 2 значения и потом не делать вычисления на каждую строку источника |
12 июл 17, 15:59 [20637587] Ответить | Цитировать Сообщить модератору |
Massa52 Member Откуда: Сообщений: 382 |
TaPaK, Действительно. Надо было и второе значение сгенерить. Соображалка подвела. |
12 июл 17, 16:26 [20637705] Ответить | Цитировать Сообщить модератору |
Massa52 Member Откуда: Сообщений: 382 |
DECLARE @tbl TABLE (d datetime, somedata varchar(10)) INSERT @tbl VALUES ('20170101 10:02:00', '1'), ('20170101 11:20:00', '2'), ('20170101 11:20:00', '3'), ('20170101 11:21:00', '4'); WITH Numbers(N) AS ( SELECT 1 UNION ALL SELECT N+1 FROM Numbers WHERE N < 48 ), c AS ( SELECT *, DATEADD(minute, @step * (N - 1), @s) t1, DATEADD(minute, @step * N, @s) t2 FROM Numbers ) SELECT t1.t1, MAX(t1.t2) t2, count(d) n FROM c t1 LEFT JOIN @tbl t2 ON t2.d >= t1.t1 AND t2.d < t1.t2 GROUP BY t1.t1 |
13 июл 17, 04:28 [20638996] Ответить | Цитировать Сообщить модератору |
TsHeloWorlder Member Откуда: Сообщений: 139 |
Massa52, Ок ! ) |
13 июл 17, 10:30 [20639677] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |