2014-09-01 2 views
-3

(I)은 하나 개의 테이블을 2 개 필드 기간으로 명명를 함유 한 발 datas는 어떻게이 쿼리를 해결할 수 있습니까?

date  val 
2014-08-01 A 
2014-08-02 B 
2014-08-03 A 
2014-08-04 A 
2014-08-05 B 
2014-08-06 B 
2014-08-07 A 
2014-08-08 A 
2014-08-09 B 
2014-08-10 A 
2014-08-11 A 

난이

MIN  MAX  A B 
2014-08-01 2014-08-05 3 2 
2014-08-06 2014-08-11 4 2 

결과 등의 출력은 일 수에 기초하여 계산 될 테이블하려는 5 일 동안. 이 질문에서 나는 5 일 간격을 선택했다.이 테이블에서 나는 값 'A'의 카운트와 값 'B'의 카운트를 선택한 간격에서 찾고 싶다. 누구나이를위한 해결책을 찾을 수 있습니까? 어떤 도움을 주시면 감사하겠습니다.

+2

빠른 해결을 위해 신속하게 질문을 편집하고 서식을 지정해야합니다. btw 무엇이 질문입니까? – deterministicFail

+0

출력 테이블에서 MIN 및 MAX는 어떻게 결정됩니까? – ydoow

+0

@ydoow 내 질문을 편집했습니다. – aparna

답변

0

은이 같은 쿼리를 실행할 수 있습니다 minDatemaxDate이 varables 있습니다

SELECT MAX(date), MIN(date), val, COUNT(val) AS occurence 
FROM table 
WHERE date>minDate AND date<maxDate 
GROUP BY val 

.

결과가 이런 식으로 읽을 수 있습니다 : 값 "발"minDate과 maxDate

사이 apper "선두로부터"시간이
2

은 내가 당신을 도울 것이라고 생각 :

DECLARE @MinDate DATETIME 
DECLARE @MaxDate DATETIME 
DECLARE @StartDate DATETIME 
DECLARE @DayCount INT 
DECLARE @A_Count INT 
DECLARE @B_Count INT 

SET @DayCount = 5 
SELECT TOP 1 @MinDate=[date] FROM table_1 ORDER BY date 
SELECT TOP 1 @MaxDate=[date] FROM table_1 ORDER BY date DESC 


CREATE TABLE #temp_table ( 
    _Min DATETIME, 
    _Max DATETIME, 
    _A INT, 
    _B INT 
) 

SET @[email protected] 
WHILE @StartDate < @MaxDate 
BEGIN 
    SELECT @A_Count = COUNT(*) FROM table_1 WHERE date BETWEEN @StartDate AND DATEADD(dd,@DayCount-1,@StartDate) AND val = 'A' 
    SELECT @B_Count = COUNT(*) FROM table_1 WHERE date BETWEEN @StartDate AND DATEADD(dd,@DayCount-1,@StartDate) AND val = 'B' 
    INSERT INTO #temp_table VALUES (@StartDate,DATEADD(dd,@DayCount-1,@StartDate),@A_Count,@B_Count) 
    SET @StartDate = DATEADD(dd,@DayCount,@StartDate) 
END 
SELECT * FROM #temp_table 
DROP TABLE #temp_table 

및 SqlFiddle 데모 : click here

0
DROP TABLE IF EXISTS my_table; 

CREATE TABLE my_table 
(date  DATE NOT NULL 
,val CHAR(1) NOT NULL 
,PRIMARY KEY (date) 
); 

INSERT INTO my_table VALUES 
('2014-08-01','A'), 
('2014-08-02','B'), 
('2014-08-03','A'), 
('2014-08-04','A'), 
('2014-08-05','B'), 
('2014-08-06','B'), 
('2014-08-07','A'), 
('2014-08-08','A'), 
('2014-08-09','B'), 
('2014-08-10','A'), 
('2014-08-11','A'); 

SELECT MIN(date) min_date 
    , MAX(date) max_date 
    , SUM(val = 'A') A 
    , SUM(val = 'B') B 
    FROM my_table 
GROUP 
    BY CEILING(TO_DAYS(date)/5)*5; 

+------------+------------+------+------+ 
| min_date | max_date | A | B | 
+------------+------------+------+------+ 
| 2014-08-01 | 2014-08-05 | 3 | 2 | 
| 2014-08-06 | 2014-08-10 | 3 | 2 | 
| 2014-08-11 | 2014-08-11 | 1 | 0 | 
+------------+------------+------+------+ 
관련 문제