Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Одним запросом... [MSSQL]


Страницы:   1 2

said46 ©   (2003-09-17 13:10:00) 

Всем привет. Есть таблица примерно такого вида:

дата значение
01.01.2003 00:00:00 1
01.01.2003 00:01:20 5
01.01.2003 00:03:05 7
...
01.01.2003 01:01:15 5
01.01.2003 01:07:23 2
...
01.01.2003 05:06:00 4
01.01.2003 05:08:09 3
...

С помощью какого запроса можно получить следующее (и можно ли):

период (час) сумма значений за период
с 00:00:00 по 00:01:00 ...
с 00:01:00 по 00:02:00 ...
с 00:02:00 по 00:03:00 ...

т.е. сумму значений за каждый час, этакая "почасовая" раскладка.

Заранее благодарен за ответ.


said46   (2003-09-17 14:52:00) [21]

Еще раз всем спасибо :)


Delirium   (2003-09-17 14:44:00) [22]

Для удобства приведу код функции округляющей до минут, переделай под часы и агрегируй сколько душе угодно

CREATE FUNCTION fn_RoundTime4Min (@input datetime, @trunc int)
RETURNS datetime
AS
BEGIN
declare @M numeric(38, 24) set @M=1.000000000000000000000000/24/60
RETURN Convert(datetime, Convert(smalldatetime, Round(Convert(numeric(38, 30), @input)/@M, 0, @trunc)*@M))
END


Delirium   (2003-09-17 14:41:00) [23]

Сначала делашь шаблон - таблицу с одним полем, в котором часы или минуты или дни - как угодно, так называемая временная линейка. На линейку join-ишь свою инфу... вот и все :)


ZrenBy   (2003-09-17 14:27:00) [24]

Вдогонку. Вариант без подзапросов.

select
H,
S = isnull(SS,0)
from(
select
H = 4*a.A+b.A
from
(select 0 as A union select 1 union select 2 union select 3 union select 4 union select 5)a,
(select 0 as A union select 1 union select 2 union select 3)b
)H
left outer join
(
select
HH = datepart(hh,[date]),
SS = sum(...)
from ...
group by datepart(hh,[date])
)T on H = HH
order by 1


said46   (2003-09-17 14:11:00) [25]

2ZrenBy:

Я восхищен!!!


said46   (2003-09-17 14:07:00) [26]

2bushmen:

очепятка

Всем спасибо.


bushmen   (2003-09-17 14:04:00) [27]

с 00:00:00 по 00:01:00
Во-первых, ты выбираешь поминутно, а не почасово.


ZrenBy   (2003-09-17 14:01:00) [28]

Тупейший вариант, можно изящней.

select
A,
S = (select sum(...) from ... where datepart(hh,..)>=A and datepart(hh,..)<A+1)
from(
select 0 as A
union select 1
union select 2
union select 3
union select 4
union select 5
union select 6
union select 7
union select 8
union select 9
union select 10
union select 11
union select 12
union select 13
union select 14
union select 15
union select 16
union select 17
union select 18
union select 19
union select 20
union select 21
union select 22
union select 23)H


Sandman25   (2003-09-17 13:40:00) [29]

[4] DenK_vrtz © (17.09.03 13:38)

Посмотрите [1] - случай пустой таблицы.


DenK_vrtz   (2003-09-17 13:38:00) [30]

Я уверен, что и одним запросом можно. Только в MSSQL не знаю как, а Oracle без проблем.


said46   (2003-09-17 13:22:00) [31]

Ясна... Я то думал как-нибудь сгруппировать можно :)
Спасибо.


Nikolay M.   (2003-09-17 13:21:00) [32]

Хранимой процедурой - на здоровье :)


Sandman25   (2003-09-17 13:15:00) [33]

Нельзя.
Из пустой таблицы должно получиться
с 00:00:00 по 00:01:00 0
с 00:01:00 по 00:02:00 0
с 00:02:00 по 00:03:00 0
И откуда эти данные брать?

Без цикла с шагом 1 час никак не получится.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо