일부 날짜 간격을 분으로 나누어야합니다. (예 : 2012-01-01 10:00 - 2012-01-01 10:00 간격은 2012-01-01 10:01, 2012-01-01 10:02, ... 2012-01로 나뉩니다. -01 10:10). 예를 들어,SQL Server에서 날짜 간격을 분 단위로 나누십시오.
CREATE TABLE [dbo].[Events](
[ID] [int] IDENTITY(1,1) NOT NULL,
[EventStart] [datetime] NOT NULL,
[EventEnd] [datetime] NOT NULL,
[Amount] [float] NOT NULL,
CONSTRAINT [PK_Events] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
이 표는 그 결과
DECLARE @i integer = 0;
DECLARE @initial_date datetime = '2012-01-01';
WHILE @i < 50000
BEGIN
INSERT INTO [Events] (EventStart, EventEnd, Amount) VALUES (DATEADD(MINUTE, 10*@i, @initial_date), DATEADD(MINUTE, 10*(@i + 1), @initial_date), @i);
SET @i = @i + 1;
END
처럼 가득 테이블 우리는 많은 10 분 간격을 가지고있다.
나는 다음과 같은 재귀 CTE를 사용하는 분을 분할하려면
DECLARE @start_date datetime = '2012-01-01';
DECLARE @end_date datetime = '2013-01-02';
WITH Date_Ranges (StatDate, Amount, IntervalStart, CurrentMinute) AS (
SELECT
DATEADD(MINUTE, 0, ev.EventStart) AS StatDate, ev.Amount, ev.EventStart AS IntervalStart, 1 AS CurrentMinute
FROM [Events] ev
WHERE ev.EventStart BETWEEN @start_date AND @end_date
UNION ALL
SELECT
DATEADD(MINUTE, CurrentMinute, ev.EventStart), ev.Amount, ev.EventStart AS IntervalStart, CurrentMinute + 1
FROM [Events] ev
INNER JOIN Date_Ranges ranges ON (ranges.IntervalStart = ev.EventStart AND
ranges.StatDate >= ev.EventStart AND
ranges.StatDate < ev.EventEnd)
WHERE DATEADD(MINUTE, CurrentMinute, ev.EventStart) BETWEEN @start_date AND @end_date AND
ev.EventStart BETWEEN @start_date AND @end_date
)
SELECT *
FROM Date_Ranges --ORDER BY StatDate
가장 큰 문제는 많은 데이터 양에 대한이 재귀 CTE의 너무 느린 실행합니다.
그럼 어떻게 속도를 높일 수 있습니까?
고맙습니다. 그것이 내가 필요한 것입니다. 실제 데이터에서 여러 번 CTE보다 재귀 적으로 빠릅니다. – eternity