2014-09-01 241 views
-3

我有一台包含命名为日2场,VAL 的数据都是我该如何解决这个问题?

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 2014-09-01 07:24:03

+0

如何在输出表中确定MIN和MAX? – ydoow 2014-09-01 07:27:47

+0

@ydoow我编辑了我的问题 – aparna 2014-09-01 07:33:19

回答

0

您可以执行下面的查询:

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

其中的minDate的maxDate是你varables。

结果会以这种方式阅读:值 “VAL” 的minDate和的maxDate

之间的冲击片雷管 “occurence” 时间
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 | 
+------------+------------+------+------+