Как я могу подсчитать количество строк в базе данных за разные периоды времени? - PullRequest
3 голосов
/ 15 апреля 2011

У меня есть таблица в базе данных Sybase с колонкой созданной датой времени. Я хочу иметь возможность подсчитать, сколько строк было создано между определенными, но накапливающимися периодами времени, например:
7:00 - 7:15
7:00 - 7:30
7:00 - 7:45
7:00 - 8:00 ... и так до тех пор, пока у меня не будет группа в последний раз, 7:00 - 18:00.

Есть ли хороший способ сделать один запрос в SQL, который вернет мне все строки со всеми счетчиками строк:
Временные ряды созданы
7:00 - 7:15 0
7:00 - 7:30 5
7:00 - 7:45 8
7:00 - 8:00 15
... ...

На данный момент у меня есть решение, но оно требует, чтобы я выполнил параметризованный запрос 44 раза, чтобы получить все данные.

Спасибо

Ответы [ 5 ]

3 голосов
/ 15 апреля 2011

Я недавно писал в блоге на эту тему, но не уверен, что он работает в Sybase, вот решение

declare @interval int
set @interval = 5
select datepart(hh, DateTimeColumn)
, datepart(mi, DateTimeColumn)/@interval*@interval
, count(*)
from thetable
group by datepart(hh, DateTimeColumn)
, datepart(mi, DateTimeColumn)/@interval*@interval

и более подробная информация http://ebersys.blogspot.com/2010/12/sql-group-datetime-by-arbitrary-time.html

0 голосов
/ 15 апреля 2011

У вас есть нерегулярные периоды (у некоторых продолжительность 15 минут, у других - 1 час, у других - несколько часов).В этом случае лучшее, что вы можете сделать, это выполнить запрос с инструкциями case:

with thetable as
(
SELECT  'TM' code, convert(datetime, '2011-04-15 07:01:00 AM') date, 1 id union all
SELECT  'TM', convert(datetime, '2011-04-15 07:05:00 AM'), 2 union all
SELECT  'TM', convert(datetime, '2011-04-15 07:08:00 AM'), 3 union all
SELECT  'TM', convert(datetime, '2011-04-15 07:20:00 AM'), 4 union all
SELECT  'TM', convert(datetime, '2011-04-15 08:25:00 AM'), 5 
)

SELECT '07:00 - 07:15' interval, sum(case when CONVERT(varchar, date, 108) between '07:00:00' AND '07:14:59' then 1 else 0 end) counting
FROM thetable

union 

select '07:15 - 08:00', sum(case when CONVERT(varchar, date, 108) between '07:15:00' AND '07:59:59' then 1 else 0 end)
from thetable

union 

select '08:00 - 09:00', sum(case when CONVERT(varchar, date, 108) between '07:59:59' AND '08:59:59' then 1 else 0 end)
from thetable

Теперь, если бы у вас были регулярные интервалы, вы бы сделали что-то подобное:

select counting, 
dateadd(ms,500-((datepart(ms,interval)+500)%1000),interval) intini
from
(
SELECT COUNT(1) counting, CONVERT(datetime, round(floor(CONVERT(float, date) * 24 * 4) / (24 * 4), 11)) interval
FROM 
(
SELECT  'TM' code, convert(datetime, '2011-04-15 07:01:00 AM') date, 1 id union all
SELECT  'TM', convert(datetime, '2011-04-15 07:05:00 AM'), 2 union all
SELECT  'TM', convert(datetime, '2011-04-15 07:08:00 AM'), 3 union all
SELECT  'TM', convert(datetime, '2011-04-15 07:20:00 AM'), 4 union all
SELECT  'TM', convert(datetime, '2011-04-15 08:25:00 AM'), 5 
) thetable
group by FLOOR(CONVERT(float, date) * 24 * 4) 
) thetable2

Обратите внимание, что 24 * 4 - это интервал 15 минут.Если ваш интервал составляет 1 час, вы должны заменить его на 24. Если ваш интервал составляет 10 минут, он должен быть 24 * 6. Я думаю, что вы получили картину.

0 голосов
/ 15 апреля 2011

Есть ли у Sybase оператор CASE?Если так, попробуйте это:

SELECT SUM(CASE WHEN CreatedTime BETWEEN ('7:00:00' AND '7:14:59') THEN 1 ELSE 0) as '7-7:15',
       SUM(CASE WHEN CreatedTime BETWEEN ('7:15:00' AND '7:29:59') THEN 1 ELSE 0) as '7:15-7:30',
FROM MyTable
Where <conditions>

Я использую это много в SQL Server.

0 голосов
/ 15 апреля 2011

Вы можете определить четверть часа, в течение которого была создана строка, и сгруппировать по этому значению. Обратите внимание, что это Oracle SQL, но Sybase, вероятно, имеет эквивалент.

select to_char(datetime_created, 'HH24') hour
, floor(to_char(datetime_created, 'MI')/15)+1 quarter
, count(1)
from my_table
group by to_char(datetime_created, 'HH24')
, floor(to_char(datetime_created, 'MI')/15)+1;
0 голосов
/ 15 апреля 2011

попробуйте

 select count(*) from table groupedby createdDateTime where createdDateTime in (
SELECT *
FROM table 
WHERE createdDateTime between createdDateTime ('2011/01/01:07:00', 'yyyy/mm/dd:hh:mm')
AND createdDateTime ('2011/01/01:07:15', 'yyyy/mm/dd:hh:mm')
)
...