결과적으로 행 수와 숫자를 반환해야하는 쿼리에는 문제가 있습니다. 요점은 최근 24 시간 동안의 데이터를 1 시간으로 나눈 값이 필요하다는 것입니다. UNION ALL을 24 번 사용하여이 쿼리를 수행했지만 SQL 쿼리 하나가 800 줄 이상 (놀랍게도 3 초만 소요됨)이 있습니다. 어떻게 든 시간을두고 그룹으로 묶을 수는 있지만 그 일을 올바르게 수행하는 방법은 모릅니다. 동등한 쿼리가 단지 약 20-30 줄의 SQL에있을 수 있다고 강력히 믿습니다. 나는 모든 단서를 고맙게 생각합니다. 여기에 제가 언급 한 것들에 대한 간단한 쿼리가 있습니다.시간별 카운트 그룹화 (from-to)
긴 쿼리 (사용 UNION ALL) : 간단한 쿼리 (이 같은 생각에 의해 반환
Time | CountT1 | CountT2 | CountT3
21:05 | 3215467 | 3456364 | 3234234
20:05 | 2253221 | 3123123 | 3238291
19:05 | 1231467 | 1232342 | 1123123
18:05 | 3112412 | 6712353 | 1233124
17:05 | 1242141 | 1241142 | 4112426
16:05 | 3123467 | 3456364 | 3234234
15:05 | 3215467 | 3412334 | 3231234
14:05 | 3324467 | 3456123 | 2312334
13:05 | 3215467 | 3456364 | 1112310
12:05 | 3215467 | 3456364 | 1231234
11:05 | 3123127 | 3456364 | 3234234
10:05 | 3215467 | 3456364 | 3234234
09:05 | 3215467 | 3456364 | 3234234
08:05 | 3215467 | 3456364 | 3234234
07:05 | 3215467 | 3456364 | 3234234
06:05 | 3215467 | 3456364 | 3234234
05:05 | 3215467 | 2212214 | 3234234
04:05 | 3215467 | 3126542 | 3234234
03:05 | 3215467 | 3123364 | 3234234
02:05 | 3215467 | 3456364 | 3234234
01:05 | 3215467 | 3456364 | 3234234
00:05 | 3215467 | 3456364 | 3123123
23:05 | 3215467 | 3456364 | 3212313
22:05 | 3223424 | 1232163 | 1235321
내가 같은 결과가 필요합니다 : 그 질문은 나에게 그런 일을 제공
DECLARE @CurrentTime datetime = GETDATE();
--Data from 1 hour
SELECT
----Time
(SELECT CONVERT(VARCHAR(5), (DATEADD(HOUR, -1, @CurrentTime)), 114)) AS [Time],
----Count on 1st table
(SELECT COUNT(T1.[TableFirstId])
FROM [dbo].[Table1] AS T1
WHERE T1.[IncomingDate] BETWEEN (DATEADD(HOUR, -1, @CurrentTime)) AND @CurrentTime) AS [CountT1],
----Count on 2nd table
(SELECT COUNT(T2.[TableSecondId])
FROM [dbo].[Table2] AS T2
WHERE T2.[IncomingDate] BETWEEN (DATEADD(HOUR, -1, @CurrentTime)) AND @CurrentTime) AS [CountT2],
----Count on 3rd table
(SELECT COUNT(T3.[TableThirdId])
FROM [dbo].[Table3] AS T3
WHERE T3.[IncomingDate] BETWEEN (DATEADD(HOUR, -1, @CurrentTime)) AND @CurrentTime) AS [CountT3]
UNION ALL
--Data from 2 hours
SELECT
----Time
(SELECT CONVERT(VARCHAR(5), (DATEADD(HOUR, -2, @CurrentTime)), 114)) AS [Time],
----Count on 1st table
(SELECT COUNT(T1.[TableFirstId])
FROM [dbo].[Table1] AS T1
WHERE T1.[IncomingDate] BETWEEN (DATEADD(HOUR, -2, @CurrentTime)) AND (DATEADD(HOUR, -1, @CurrentTime))) AS [CountT1],
----Count on 2nd table
(SELECT COUNT(T2.[TableSecondId])
FROM [dbo].[Table2] AS T2
WHERE T2.[IncomingDate] BETWEEN (DATEADD(HOUR, -2, @CurrentTime)) AND (DATEADD(HOUR, -1, @CurrentTime))) AS [CountT2],
----Count on 3rd table
(SELECT COUNT(T3.[TableThirdId])
FROM [dbo].[Table3] AS T3
WHERE T3.[IncomingDate] BETWEEN (DATEADD(HOUR, -2, @CurrentTime)) AND (DATEADD(HOUR, -1, @CurrentTime))) AS [CountT3]
UNION ALL
--Data from 3 hours
SELECT
----Time
(SELECT CONVERT(VARCHAR(5), (DATEADD(HOUR, -3, @CurrentTime)), 114)) AS [Time],
----Count on 1st table
(SELECT COUNT(T1.[TableFirstId])
FROM [dbo].[Table1] AS T1
WHERE T1.[IncomingDate] BETWEEN (DATEADD(HOUR, -3, @CurrentTime)) AND (DATEADD(HOUR, -2, @CurrentTime))) AS [CountT1],
----Count on 2nd table
(SELECT COUNT(T2.[TableSecondId])
FROM [dbo].[Table2] AS T2
WHERE T2.[IncomingDate] BETWEEN (DATEADD(HOUR, -3, @CurrentTime)) AND (DATEADD(HOUR, -2, @CurrentTime))) AS [CountT2],
----Count on 3rd table
(SELECT COUNT(T3.[TableThirdId])
FROM [dbo].[Table3] AS T3
WHERE T3.[IncomingDate] BETWEEN (DATEADD(HOUR, -3, @CurrentTime)) AND (DATEADD(HOUR, -2, @CurrentTime))) AS [CountT3]
UNION ALL
--(etc...)
) :
DECLARE @CurrentTime datetime = GETDATE();
--Data from 24 hours
SELECT
----Count on 1st table
(SELECT COUNT(T1.[TableFirstId])
FROM [dbo].[Table1] AS T1
WHERE T1.[IncomingDate] BETWEEN (DATEADD(HOUR, -24, @CurrentTime)) AND @CurrentTime) AS [CountT1],
----Count on 2nd table
(SELECT COUNT(T2.[TableSecondId])
FROM [dbo].[Table2] AS T2
WHERE T2.[IncomingDate] BETWEEN (DATEADD(HOUR, -24, @CurrentTime)) AND @CurrentTime) AS [CountT2],
----Count on 3rd table
(SELECT COUNT(T3.[TableThirdId])
FROM [dbo].[Table3] AS T3
WHERE T3.[IncomingDate] BETWEEN (DATEADD(HOUR, -24, @CurrentTime)) AND @CurrentTime) AS [CountT3]
FROM [dbo].[Table1] AS T1
GROUP BY DATEPART(HOUR, T1.[IncomingDate])
그러나 예상대로 작동하지 않습니다. 저를 이해하도록 도와 줄 사람이 있습니까? 내 문제를 해결 하시겠습니까?
테스트 할 테이블이 없습니다. 어떻게 다르게 작동하는지 말할 수 있습니까? 1 행을 반환합니까? – Kuzgun
마지막 쿼리는 동일한 중복 된 행 24 개를 반환합니다 (24 시간의 계산 된 숫자 만). – JakubM