Требуется запрос - определите количество строк в минуту - PullRequest
5 голосов
/ 08 июля 2011

Для простоты, скажем, у меня есть таблица SQL Server 2008 с одним столбцом, который имеет тип данных datetime.Я хотел бы запрос, который производит количество строк для каждого минутного интервала.Например, результаты будут выглядеть следующим образом:

7/3/2011 14:00:00 | 1000
7/3/2011 14:01:00 | 1097
7/3/2011 14:02:00 |  569

Первая строка будет означать, что 1000 строк имеют значение даты / времени в период с 03.07.2011 13:59:00 по 03.07.2011 14:00: 00.

Вторая строка будет означать, что 1097 строк имеют значение даты / времени в период с 03.07.2011, 14:00:00 и 03.03.2011, 14: 01: 00.* Третья строка будет означать, что 569 строк имеют значение даты / времени между 03.07.2011 14:01:00 и 03.07.2011 14: 02: 00.

Спасибо.

Ответы [ 4 ]

13 голосов
/ 08 июля 2011

Это:

;WITH CTE_ExampleData as (
    select stamp = '07/07/2011 14:00:01'
    union select stamp = '07/07/2011 14:00:02'
    union select stamp = '07/07/2011 14:00:03'
    union select stamp = '07/07/2011 14:01:01'
    union select stamp = '07/07/2011 14:01:02'
    union select stamp = '07/07/2011 14:01:03'
    union select stamp = '07/07/2011 14:01:04'
    union select stamp = '07/07/2011 14:02:02'
    union select stamp = '07/07/2011 14:02:03'
    union select stamp = '07/07/2011 14:02:04'
    union select stamp = '07/07/2011 14:02:05'
)
 select 
    stamp = dateadd(mi,datediff(mi,0,stamp) + 1,0),
    rows = count(1)
 from CTE_ExampleData
 group by dateadd(minute,datediff(mi,0,stamp)+1,0)

Возвращает

stamp                       rows
2011-07-07 14:01:00.000     3
2011-07-07 14:02:00.000     4
2011-07-07 14:03:00.000     4
10 голосов
/ 08 июля 2011

Простая группа Автор:

 Select DateAdd(minute, DateDiff(minute, 0, [colName]), 0), Count(*)
 From [tableName]
 Group By DateAdd(minute, DateDiff(minute, 0, [colName]), 0)

Если вы хотите, чтобы каждая минута находилась в каком-то диапазоне выходных данных, независимо от того, есть ли какие-либо данные в эту минуту, используйте Общее табличное выражение (CTE):

 Declare @startMinute smalldatetime Set @startMinute = '30 June 2011'
 Declare @endMinute smalldatetime Set @endMinute = '1 July 2011';
 With minuteList(aMinute) As 
 (Select @startMinute Union All
    Select dateadd(minute,1, aMinute)
    From minuteList
    Where aMinute < @endMinute)
 Select aMinute, Count(T.[colName])
 From minuteList ml Left Join [tableName] T
      On DateAdd(minute, DateDiff(minute, 0, T.[colName]), 0) = aMinute
 Group By aMinute
 Option (MaxRecursion 10000);
1 голос
/ 04 мая 2014

Вы также можете получить среднее значение в минуту, если кто-то хочет, чтобы вы, скажем, сказали в среднем, сколько времени ваш ETL собирался занять для записей X.

SELECT AVG(ABC.TOTAL_MINUTE) FROM (Select DateAdd(minute, DateDiff(minute, 0,createdon),0) AS [DAY_MINUTE], Count(*) AS [TOTAL_MINUTE] From contactbase Group By DateAdd(minute, DateDiff(minute, 0, createdon), 0)) ABC here

Или если вы хотите получитьболее подробно, вы могли бы дать проценты завершить все это ... положить его в процесс ... вы поняли.

DECLARE @TtlToProcess AS DECIMAL --- put arbitrary number of 2.5 million in as this is aproximate, could be replaces with true source count if known. SET @TtlToProcess = 2500000 SELECT DATEDIFF(MINUTE,MIN(CB.CreatedOn),max(CB.CreatedOn)) AS [Minutes Run], ROUND(100*(CAST(COUNT(*) AS DECIMAL)/CAST(@TtlToProcess AS DECIMAL)),1) AS [%Complete], ROUND(100-(100*(CAST(COUNT(*) AS DECIMAL)/CAST(@TtlToProcess AS DECIMAL))),1) AS [% Left], COUNT(*) AS [Rows Processed], @TtlToProcess-COUNT(*) AS [Rows Left], (SELECT AVG(ABC.TOTAL_MINUTE) FROM (SELECT DATEADD(MINUTE, DATEDIFF(MINUTE, 0, CreatedOn), 0) AS [DAY_MINUTE], COUNT(*) AS [TOTAL_MINUTE] FROM ContactBase GROUP BY DATEADD(MINUTE, DATEDIFF(MINUTE, 0, CreatedOn), 0)) AS ABC) AS [Avg. Rows per Minute], ROUND(((@TtlToProcess-COUNT(*))/(SELECT AVG(ABC.TOTAL_MINUTE) FROM (SELECT DATEADD(MINUTE, DATEDIFF(MINUTE, 0, CreatedOn), 0) AS [DAY_MINUTE], COUNT(*) AS [TOTAL_MINUTE] FROM ContactBase GROUP BY DATEADD(MINUTE,DATEDIFF(MINUTE, 0, CreatedOn), 0)) ABC))/CAST(60 AS DECIMAL),2) AS [Est. Hours Left],DATEADD(hh,((@TtlToProcess-COUNT(*))/(SELECT AVG(ABC.TOTAL_MINUTE) FROM (SELECT DATEADD(MINUTE, DATEDIFF(MINUTE, 0, CreatedOn), 0) AS [DAY_MINUTE], COUNT(*) AS [TOTAL_MINUTE] FROM ContactBase GROUP BY DATEADD(MINUTE, DATEDIFF(MINUTE, 0, CreatedOn), 0)) AS ABC))/CAST(60 AS DECIMAL),GETDATE()) AS [Est. Complete Date_Time] FROM dbo.ContactBase AS CB
0 голосов
/ 04 мая 2014
Select DateAdd(minute, DateDiff(minute, 0, createdon), 0) AS [DAY_MINUTE], Count(*) AS [TOTAL_MINUTE] From contactbase Group By DateAdd(minute, DateDiff(minute, 0, createdon), 0) order by DateAdd(minute, DateDiff(minute, 0, createdon), 0) desc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...