2011-11-12 2 views
0

나는 통계보고를 작성하고 있으며 우리는 단지 조각을 얻고 있기 때문에 많은 양의 데이터로 작업하고 있습니다. 예를 들어 DateTime/Data 객체를 출력하고 시작일부터 종료일까지 개월 간격으로 추적합니다.통계 데이터에 누락 된 포인트 값을 얻는 방법?

문제는 데이터가있는 데이터 만있는 데이터를 넣는 것입니다. 예를 들어 2011 년 2 월 2011 년 2 월과 2011 년 8 월에 데이터를 제공하는 것입니다. 어떻게하면 0을 넣을 수 있는지 알 필요가 있습니다. 2011 년 1 월 , 2011 년 3 월 등.

누군가 내가 오버 헤드가 많이 발생하지 않고 이것을 어떻게 구성 할 수 있을지 아이디어를 줄 수 있습니까? 먼저 루프를 얻은 다음 필요한 간격 (예 : 분, 월, 연도)을 가져 와서 목록에 넣은 다음 0을 초과하면 0을 나타내는 DateTime/Data 객체를 검사합니다. 또한 차트에 점을 만들기위한 것입니다.

+0

? 데이터 베이스? 웹 서비스? 다른 데이터 소스? – PiRX

+0

데이터가 저장 프로 시저의 데이터베이스에서 전송됩니다. – Darren

답변

1

는 연결리스트로 데이터를로드하고, 누락 된 데이터 포인트를 삽입 :

using System; 
using System.Collections.Generic; 

namespace Whatever 
{ 
    public struct DataPoint 
    { 
    private DateTime time; 
    private int value; 

    public DataPoint(DateTime time, int value) 
    { 
     this.time = time; 
     this.value = value; 
    } 

    public DateTime Time 
    { 
     get { return this.time; } 
    } 

    public int Value 
    { 
     get { return this.value; } 
    } 

    public override string ToString() 
    { 
     return string.Format("{0:D2}/{1}: {2}", this.time.Month, this.time.Year, this.value); 
    } 
    } 

    public static class Program 
    { 
    public static void Main() 
    { 
     // List of the datapoints, e.g. loaded from a database 
     var dataPoints = new List<DataPoint>(); 
     dataPoints.Add(new DataPoint(new DateTime(2010, 11, 1), 10)); 
     dataPoints.Add(new DataPoint(new DateTime(2011, 2, 1), 20)); 
     dataPoints.Add(new DataPoint(new DateTime(2011, 3, 1), 30)); 
     dataPoints.Add(new DataPoint(new DateTime(2011, 6, 1), 40)); 
     dataPoints.Add(new DataPoint(new DateTime(2011, 9, 1), 50)); 
     dataPoints.Add(new DataPoint(new DateTime(2011, 12, 1), 60)); 
     dataPoints.Add(new DataPoint(new DateTime(2012, 2, 1), 70)); 

     // Endpoints of the measurement interval 
     var begin = new DateTime(2010, 9, 1); 
     var end = new DateTime(2012, 4, 1); 

     // Check each month and insert missing datapoints 
     var time = begin; 
     var i = 0; 
     while (time <= end) 
     { 
     if (i < dataPoints.Count) 
     { 
      if (time < dataPoints[i].Time) 
      { 
      var dataPoint = new DataPoint(time, 0); 
      dataPoints.Insert(i, dataPoint); 
      } 
     } 
     else 
     { 
      var dataPoint = new DataPoint(time, 0); 
      dataPoints.Add(dataPoint); 
     } 
     ++i; 
     time = time.AddMonths(1); 
     } 

     // Print list 
     foreach (var dataPoint in dataPoints) 
     Console.WriteLine(dataPoint); 
    } 
    } 
} 

편집 : 만이 데이터를 플롯해야하는 경우, 누락 된 데이터 포인트를 삽입 할 필요가 없습니다. 나는 단순히 기존의 점들 사이를 보간하기 만하면된다. 기존 점을 채워진 원으로 표시하면 누락 된 점을이 연결선에있는 빈 원으로 표시 할 수 있습니다 (이러한 그래프 컨트롤은 보간에 지정된 점을 저장하지 않고 작성할 수 있습니다).

+0

안녕하세요, 차트는 꺾은 선형 차트이며 레이블은 몇 달입니다. 누락 된 부분은 보간으로 수행 할 수있는 데이터가없는 달에 대한 0 초입니다. 고맙습니다. – Darren

+0

PiRX의 솔루션은 누락 된 데이터 포인트를 데이터베이스 측에 삽입하는 방법을 제공합니다. 내 솔루션은 누락 된 데이터 포인트를 클라이언트 측에 삽입합니다. 그래프 및 보간에 대한 내 의견은 그래프 컨트롤의 개발자 인 상황을 나타냅니다. – kol

+0

네, 그렇습니다. 솔루션은 많은 양의 데이터이므로 더 잘 작동합니다. 또한 간격을 며칠로 변경하려면 어떻게 표시해야합니까? 측정은 초, 분, 일, 달 및 년이 될 것입니다. 다시 한 번 도움을 주셔서 감사합니다. – Darren

1

가능하면이 절차에 대한 저장 프로 시저 및/또는 SQL 호출을 수정하고 부분 조인 (LEFT/RIGHT JOIN) 및 COALESCE/ISNULL 함수를 사용하여 누락 된 데이터를 삽입하는 것이 좋습니다. 이 같은

뭔가 : 어디 데이터를 받고에서

DECLARE @range AS TABLE (datePoint DATETIME); 
DECLARE @data AS TABLE (datePoint DATETIME, value INT); 

-- setup date range 
DECLARE @currentDatePoint AS DATETIME; 
SET @currentDatePoint = '01/01/2011' 
WHILE @currentDatePoint < '01/01/2012' 
BEGIN 
    INSERT INTO @range VALUES (@currentDatePoint); 
    SET @currentDatePoint = DATEADD(MONTH, 1, @currentDatePoint); 
END 

-- setup test data 
SET @currentDatePoint = '01/01/2011' 
WHILE @currentDatePoint < '01/01/2012' 
BEGIN 
    INSERT INTO @data VALUES (@currentDatePoint, DATEPART(MONTH, @currentDatePoint)); 
    SET @currentDatePoint = DATEADD(MONTH, 2, @currentDatePoint); 
END 
--end setup 

-- actual select 
SELECT 
    r.datePoint, 
    ISNULL(d.value, 0) 
FROM 
    @range r 
LEFT JOIN 
    @data d ON r.datePoint = d.datePoint 
관련 문제