2017-12-17 10 views
-1

Wenn meine Datensätze wie folgt mit 4 Spalten Criteria, value, startdate, enddate sind. Aus der verfügbaren startdate muss ich Werte mit Zeitintervall gruppieren.Gruppieren von Datensätzen basierend auf dem erforderlichen Zeitintervall in SQL Server

Wenn startdate 8,56 und interval ist 10 Minuten, dann muss ich Gruppe Datensätze aus 8,56 bis 9,05)

criteria Value startdate     EndDate 

exceptions 5  2017-12-13 08:56:00.000  2017-12-13 09:00:00.000 
exceptions 2  2017-12-13 09:01:00.000  2017-12-13 09:05:00.000 
exceptions 1  2017-12-13 09:06:00.000  2017-12-13 09:10:00.000 
exceptions 3  2017-12-13 09:11:00.000  2017-12-13 09:15:00.000 
exceptions 1  2017-12-13 09:16:00.000  2017-12-13 09:20:00.000 

Ich mag würde die Datensätze auf erforderliche Zeitintervall Gruppe wie 10 Minuten, 12 Minuten und 15 Minuten.

Wenn das Intervall in 10 Minuten, dann sollte das Ergebnis wie unten sein, (Aggregations- Summe (Wert))

exceptions 7 2017-12-13 08:56:00.000  2017-12-13 09:05:00.000 
exceptions 4 2017-12-13 09:06:00.000  2017-12-13 09:15:00.000 
exceptions 1 2017-12-13 09:16:00.000  2017-12-13 09:20:00.000 

Wie kann ich das erreichen?

+0

Statt Bilder liefern CREATE TABLE' DDL und 'INSERT' Aussagen. –

+0

Mögliches Duplikat von [Gruppierung nach Stunden oder nach 10 Minuten] (https://stackoverflow.com/questions/5002661/how-to-group-time-by-hour-or-by-10-minutes) –

+0

Aufgrund von Ausrichtungsproblemen habe ich es als Bild eingefügt. – Sridevi

Antwort

0

versuchen Sie Folgendes:

declare @tab table (criteria varchar(100), [value] int, startdate datetime, enddate datetime) 

insert into @tab 
select 'exceptions', 5, '2017-12-13 8:56:00.000', '2017-12-13 9:0:0.000' 
union all 
select 'exceptions', 2, '2017-12-13 9:01:00.000', '2017-12-13 9:05:0.000' 
union all 
select 'exceptions', 1, '2017-12-13 9:06:00.000', '2017-12-13 9:10:0.000' 
union all 
select 'exceptions', 3, '2017-12-13 9:11:00.000', '2017-12-13 9:15:0.000' 
union all 
select 'exceptions', 1, '2017-12-13 9:16:00.000', '2017-12-13 9:20:0.000' 

declare @interval int = 10--15,20 --change here 
declare @start int = 10--15,20  --also change here 

declare @i int = 1 
declare @stdt datetime 
declare @eddt datetime 
declare @tab_new table (criteria varchar(100), [value] int, interval int, grp int, start_dt datetime, end_date datetime) 
while ((select count(1) from @tab) > 0) 
begin 
    set @stdt = (select top 1 startdate from @tab) 
    set @eddt = (select top 1 enddate from @tab) 

    insert into @tab_new 
    select criteria, [value], @interval - DATEDIFF(MINUTE, dateadd(minute, -1, startdate), enddate), @i, @stdt, @eddt from @tab where startdate = @stdt and enddate = @eddt 
    set @interval -= DATEDIFF(MINUTE, dateadd(minute, -1, @stdt), @eddt) 

    delete from @tab where startdate = @stdt and enddate = @eddt 
    if @interval = 0 begin set @i += 1 set @interval = @start end 
end 

select criteria, sum([value]) [value], min(start_dt) startdate, max(end_date) enddate from @tab_new 
group by criteria, grp 

HTH.

0

Hier ist ein Set-basierten Beispiel für Ihre speziellen Anforderungen basierend auf this answer:

DECLARE 
     @MinuteInterval int = 10 
    , @StartDate datetime2(3) 
    , @EndDate datetime2(3); 
SELECT 
     @StartDate = MIN(StartDate) 
    , @EndDate = MAX(EndDate) 
FROM dbo.Example; 
WITH intervals AS (
    SELECT 
      criteria 
     , value 
     , DATEADD(minute, (DATEDIFF(minute, @StartDate, StartDate)/@MinuteInterval) * @MinuteInterval, @StartDate) AS StartInterval 
     , EndDate 
    FROM dbo.Example 
    ) 
SELECT 
     criteria 
    , SUM(value) AS ValueCount 
    , StartInterval 
    , CASE WHEN DATEADD(minute, @MinuteInterval - 1, StartInterval) < @EndDate 
     THEN DATEADD(minute, @MinuteInterval-1, StartInterval) 
     ELSE @EndDate END AS EndInterval 
FROM intervals 
GROUP BY 
     criteria 
    , StartInterval 
ORDER BY 
     criteria 
    , StartInterval; 
Verwandte Themen