Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Одинаковое количество временных промежутков  [new]
chiz
Member

Откуда:
Сообщений: 89
Здравствуйте!
Столкнулся с такой задачей.
Есть запрос:
select 
	IntegrationName,
	CONVERT(varchar,dateadd(day,datepart(dayofyear, FirstOccurrence),'01-01-2014'),2) as "F"
from 
	REPORTER_STATUS
where
	FirstOccurrence > '2014-04-01 00:00:00.000'
	and
	FirstOccurrence < '2014-04-05 00:00:00.000'
order by
	CONVERT(varchar,dateadd(day,datepart(dayofyear, FirstOccurrence),'01-01-2014'),2) ASC


По которому выводится название - IntegrationName и День когда это название появлялось.

1	14.04.02
2 14.04.02
3 14.04.02
1 14.04.03
2 14.04.03
1 14.04.04

Хотелось бы не зависимо от выбираемого промежутка
FirstOccurrence > '2014-04-01 00:00:00.000'
	and
	FirstOccurrence < '2014-04-05 00:00:00.000'


выводилось 20 периодов.

Например задал промежуток 1 день - запрос его поделил на 20 и вывел 20 промежутков.
или задал 1 год - и в результате получилось 20 интервалов...


Спасибо!
21 май 14, 16:26    [16050074]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковое количество временных промежутков  [new]
Glory
Member

Откуда:
Сообщений: 104760
chiz
Например задал промежуток 1 день - запрос его поделил на 20 и вывел 20 промежутков.
или задал 1 год - и в результате получилось 20 интервалов...

Ну так возьмите разницу границ диапазона и поделите ее на 20
И получите шаг
21 май 14, 16:30    [16050100]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковое количество временных промежутков  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
NTILE (integer_expression) OVER ( [ <partition_by_clause> ] < order_by_clause > )??
21 май 14, 16:40    [16050195]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковое количество временных промежутков  [new]
chiz
Member

Откуда:
Сообщений: 89
iap,

Благодарствую.

в селекте както так?

NTILE(20) OVER (ORDER BY  (datediff(hour,'2014-04-01 00:00:00.000','2014-04-05 00:00:00.000')/20) ASC) as 'n'
21 май 14, 17:01    [16050373]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковое количество временных промежутков  [new]
_human
Member

Откуда:
Сообщений: 560
chiz,

NTILE(20) OVER (ORDER BY  (datediff(hour,'2014-04-01 00:00:00.000','2014-04-05 00:00:00.000')) ASC) as 'n'


учтите, что если у вас будет кол-во записей которое на 20 без остатка не делится, то NTILE увеличит кол-во записей в 1-х [N] группах на 1. т.е. будет например 4-е группы по 21, в все остальные по 20.
21 май 14, 17:42    [16050667]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковое количество временных промежутков  [new]
Glory
Member

Откуда:
Сообщений: 104760
Разве получение отрезков одинаковой длины тоже самое, что и деление существующих записей на равные группы ???
Ведь для какого-то из отрезков может не быть данных вообще.
21 май 14, 17:56    [16050747]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковое количество временных промежутков  [new]
chiz
Member

Откуда:
Сообщений: 89
_human,

погодите погодите)

мне нужно всего 20 записей, а не группировать все данные по 20(21) записи
22 май 14, 08:44    [16052418]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковое количество временных промежутков  [new]
chiz
Member

Откуда:
Сообщений: 89
Простите, виноват)

Опять написал - потом подумал)
22 май 14, 08:45    [16052420]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковое количество временных промежутков  [new]
chiz
Member

Откуда:
Сообщений: 89
Всем thnx ;) Все получилось)
22 май 14, 09:21    [16052501]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковое количество временных промежутков  [new]
chiz
Member

Откуда:
Сообщений: 89
Не. Я тут подумал что NTILE мне не подходит.
Вот алгоритм который мне наверняка подойдет:

в селекте:

CASE WHEN start<end THEN start=start+datediff(hour,start,stop)/20
ELSE end


NTILE не дает такого...(

нужно временной промежуток разделить на 20 частей равных
22 май 14, 13:23    [16054526]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковое количество временных промежутков  [new]
chiz
Member

Откуда:
Сообщений: 89
CASE WHEN start<end THEN start=start+datediff(hour,start,end)/20
ELSE end

так
22 май 14, 13:23    [16054539]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковое количество временных промежутков  [new]
Glory
Member

Откуда:
Сообщений: 104760
chiz
CASE WHEN start<end THEN start=start+datediff(hour,start,end)/20
ELSE end


так

А как CASE создаст 20 записей с периодами ?
22 май 14, 13:36    [16054697]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковое количество временных промежутков  [new]
chiz
Member

Откуда:
Сообщений: 89
Мне нужно идти с шагом (весь период)/20, и каждый такой шаг нумеровать +1

Т.е первый шаг = 1, второй =2...
22 май 14, 13:38    [16054712]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковое количество временных промежутков  [new]
Glory
Member

Откуда:
Сообщений: 104760
chiz
Мне нужно идти с шагом (весь период)/20, и каждый такой шаг нумеровать +1

Т.е первый шаг = 1, второй =2...

Вот как можно "шагать" по пустой таблице - объясните мне.
22 май 14, 13:40    [16054734]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковое количество временных промежутков  [new]
chiz
Member

Откуда:
Сообщений: 89
Glory,

Что значит по пустой таблице?
Поле IntegrationName - название
FirstOccurrence - дата

select 
	IntegrationName,
	FirstOccurrence
from 
	REPORTER_STATUS
where
	FirstOccurrence > '2014-04-01 00:00:00.000'
	and
	FirstOccurrence < '2014-04-30 00:00:00.000'
22 май 14, 13:52    [16054888]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковое количество временных промежутков  [new]
Glory
Member

Откуда:
Сообщений: 104760
chiz
Поле IntegrationName - название
FirstOccurrence - дата

select 
	IntegrationName,
	FirstOccurrence
from 
	REPORTER_STATUS
where
	FirstOccurrence > '2014-04-01 00:00:00.000'
	and
	FirstOccurrence

И что этот запрос гарантированно возвращает минимум по одной записи для каждой 1/20ой части заданного периода ?
22 май 14, 13:55    [16054916]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковое количество временных промежутков  [new]
chiz
Member

Откуда:
Сообщений: 89
Glory,

необязательно...
22 май 14, 14:03    [16055007]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковое количество временных промежутков  [new]
Glory
Member

Откуда:
Сообщений: 104760
chiz
Glory,

необязательно...

ну дык и "как можно "шагать" по пустой таблице - объясните мне."
22 май 14, 14:04    [16055014]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковое количество временных промежутков  [new]
chiz
Member

Откуда:
Сообщений: 89
Glory,

ну если нету информации за определенный ШАГ, то просто не будет выводится ничего...
22 май 14, 14:06    [16055041]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковое количество временных промежутков  [new]
Glory
Member

Откуда:
Сообщений: 104760
chiz
Glory,

ну если нету информации за определенный ШАГ, то просто не будет выводится ничего...

Как же тогда "мне нужно всего 20 записей", если "не будет выводится ничего" ?
22 май 14, 14:08    [16055053]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковое количество временных промежутков  [new]
chiz
Member

Откуда:
Сообщений: 89
Glory,

я только один раз написал что мне нужно "20 записей"...

мне нужно 20 промежутков, не 20 записей.

Записей столько сколько выводит...
22 май 14, 14:11    [16055081]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковое количество временных промежутков  [new]
Glory
Member

Откуда:
Сообщений: 104760
chiz
мне нужно 20 промежутков,

И откуда/из чего по-вашему сервер выберет/создаст эти 20 промежутков ?
22 май 14, 14:12    [16055088]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковое количество временных промежутков  [new]
chiz
Member

Откуда:
Сообщений: 89
Glory,

Так в этом и состоит мой вопрос.

Вот алгоритм который не работает, но определяет смысл работы запроса.
CASE WHEN start<end THEN start=start+datediff(hour,start,end)/20
ELSE end


Нашли весь период (например 4 дня), поделили его на 20 = 4.8 часа

Начиная с начала - (00; 4.8) - 1 - первый промежуток

Если в этом промежутке есть записи то вывести их как

Запись1 - 1
Запись2 - 1
...
ЗаписьN - 1
....
....
....
ЗаписьN - 20
22 май 14, 14:17    [16055133]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковое количество временных промежутков  [new]
Glory
Member

Откуда:
Сообщений: 104760
chiz
Так в этом и состоит мой вопрос.

Нельзя выбрать данные, которых нет нигде.
Можно только сгенерировать их.

chiz
Вот алгоритм который не работает,

если алгоритм не работает, то это неправильный алгоритм
22 май 14, 14:19    [16055147]     Ответить | Цитировать Сообщить модератору
 Re: Одинаковое количество временных промежутков  [new]
chiz
Member

Откуда:
Сообщений: 89
Glory
chiz
Поле IntegrationName - название
FirstOccurrence - дата

select 
	IntegrationName,
	FirstOccurrence
from 
	REPORTER_STATUS
where
	FirstOccurrence > '2014-04-01 00:00:00.000'
	and
	FirstOccurrence

И что этот запрос гарантированно возвращает минимум по одной записи для каждой 1/20ой части заданного периода ?


Да, я сделал это. У вас есть предложения?
22 май 14, 14:23    [16055185]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить