Запрос записей и группировка по блоку времени - PullRequest
3 голосов
/ 17 мая 2011

У меня есть приложение, которое может запускаться несколько раз в день.Каждый прогон приводит к данным, которые записываются в таблицу для отчета о произошедших событиях.Основная таблица отчета выглядит примерно так:

Id    SourceId    SourceType    DateCreated
5048  433         FILE          5/17/2011 9:14:12 AM
5049  346         FILE          5/17/2011 9:14:22 AM
5050  444         FILE          5/17/2011 9:14:51 AM
5051  279         FILE          5/17/2011 9:15:02 AM
5052  433         FILE          5/17/2011 12:34:12 AM
5053  346         FILE          5/17/2011 12:34:22 AM
5054  444         FILE          5/17/2011 12:34:51 AM
5055  279         FILE          5/17/2011 12:35:02 AM

Я могу сказать, что было два прогона, но я бы хотел, чтобы можно было запрашивать диапазон дат, сколько раз процесс былзапустить.Я хотел бы получить запрос, который показывает время начала процесса и количество файлов в группе.Этот запрос дает мне то, что я хочу, с точки зрения того, что я могу видеть, какой день и час и сколько файлов было запущено, но не совсем так, как мне бы хотелось.И это не приспособило бы пробеги, которые бежали с 8:58 до 9:04, например.Это также будет групповые прогоны, которые начались в 9:02 и 9:15, например.

Select dateadd(day,0,datediff(day,0,DateCreated)) as [Date], datepart(hour, DateCreated) as [Hour], Count(*) [File Count]
From   MyReportTable
Where DateCreated between '5/4/2011' and '5/18/2011'
    and SourceType = 'File'
Group By dateadd(day,0,datediff(day,0,DateCreated)), datepart(hour, DateCreated)
Order By dateadd(day,0,datediff(day,0,DateCreated)), datepart(hour, DateCreated)

Я понимаю, что любые трассы, которые находятся близко друг к другу, скорее всего, будут сгруппированы вместе, и я в порядкеЯ только ожидаю получить грубую группировку.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 17 мая 2011

Пройдите еще несколько шагов:

SELECT
    Count(Id), 
    DATEPART(year, DateCreated) As yr, 
    DATEPART(month, DateCreated) As mth, 
    DATEPART(day, DateCreated) As day, 
    DATEPART(Hour, DateCreated) as hr, 
    DATEPART(minute, DateCreated) as mnt
FROM 
    MyReportTable
WHERE DateCreated between '5/4/2011' and '5/18/2011'
    and SourceType = 'File'
GROUP BY 
    DATEPART(year, DateCreated), 
    DATEPART(month, DateCreated), 
    DATEPART(day, DateCreated), 
    DATEPART(Hour, DateCreated),
    DATEPART(minute, DateCreated)
ORDER BY 
    DATEPART(year, DateCreated),
    DATEPART(month, DateCreated), 
    DATEPART(day, DateCreated), 
    DATEPART(Hour, DateCreated),
    DATEPART(minute, DateCreated)

Редактировать

Чтобы получить разрешение 15 минут, измените последний столбец на

(DATEPART(minute, DateCreated)/15)

(добавьте +1 к этому в выборе, чтобы получить 1,2,3,4).

2 голосов
/ 18 мая 2011

Если вы уверены, что эти прогоны являются смежными и не перекрываются, вы сможете использовать поле Id, чтобы разбить ваши группы.Найдите поля Id, которые разделены только на 1, и поля, созданные с датой, которые больше некоторого порогового значения.Судя по вашим данным, записи внутри прогона вводятся с интервалом не более минуты друг от друга, поэтому безопасным порогом может быть минута или больше.

Это даст вам время запуска

SELECT mrtB.Id, mrtB.DateCreated
FROM MyReportTable AS mrtA
INNER JOIN MyReportTable AS mrtB
    ON (mrtA.Id + 1) = mrtB.Id
WHERE DateDiff(mi, mrtA.DateCreated, mrtB.DateCreated) >= 1

Я назову это DataRunStarts

Теперь вы можете использовать это, чтобы получить информацию о том, где группы начинались и заканчивались

SELECT drsA.Id AS StartID, drsA.DateCreated, Min(drsB.Id) AS ExcludedEndId
FROM DataRunStarts AS drsA, DataRunStarts AS drsB
WHERE (((drsB.Id)>[drsA].[id]))
GROUP BY drsA.Id, drsA.DateCreated

Я назову эти DataRunGroups.Я назвал это последнее поле «Исключено», поскольку его идентификатор просто будет использоваться для определения конечной границы для набора идентификаторов, которые будут извлечены.

Теперь мы можем использовать DataRunGroups и MyReportTable, чтобы получитьcount

SELECT DataRunGroups.StartID, Count(MyReportTable.Id) AS CountOfRecords
FROM DataRunGroups, MyReportTable
WHERE (((MyReportTable.Id)>=[StartId] And (MyReportTable.Id)<[ExcludedEndId]))
GROUP BY DataRunGroups.StartID;

Я назову это DataRunCounts

Теперь мы можем собрать DataRunGroups и DataRunCounts вместе, чтобы получить время начала и число.

SELECT DataRunGroups.DateCreated, DataRunCounts.CountOfRecords
FROM DataRunGroups
INNER JOIN DataRunCounts
    ON DataRunGroups.StartID = DataRunCounts.StartID;

В зависимости от ваших настроекВозможно, вам придется сделать все это по одному запросу, но вы поняли идею.Кроме того, самые первые и самые последние запуски не будут включены в это, потому что не будет никакого идентификатора начала, чтобы пройти для самого первого запуска, и никакого идентификатора конца, чтобы пройти для самого последнего запуска.Чтобы включить их, вы должны были бы делать запросы только для этих двух диапазонов и объединять их вместе со старым запросом DataRunGroups для создания новых DataRunGroups.Другие запросы, использующие DataRunGroups, будут работать так же, как описано выше.

...