4

四半期ごとの財務データの大規模な(cvsファイルで1GB)セットがあり、月次データにパディングする必要があります。各行には会社IDと日付スタンプがありますが、会社ごとにレポートの日付が異なります(3月、6月、9月、12月と2月、5月、8月、11月)。

表:出典

Co.   |Date      |NPAT   |Debt
A     |31-Dec-09 |123    |4,000
B     |29-Feb-10 |12     |300
A     |31-Mar-10 |200    |4,500
B     |31-May-10 |11     |200
A     |30-Jun-10 |159    |4,300
C     |30-Jun-10 |-30    |4

例の会社Aは、3月、6月、9月、12月に報告するため、3月の数字を4月と5月にコピーし、6月の数字を7月と8月に、9月から10月と11月に、12月の数字を1月と2月にコピーする必要があります。B社の場合、報告期間は2月、5月、8月、11月です。

上記の例を使用すると、必要なものは次のとおりです。

表:宛先

Co.   |Date      |NPAT   |Debt
A     |31-Dec-09 |123    |4,000
A     |31-Jan-10 |123    |4,000
A     |29-Feb-10 |123    |4,000
B     |29-Feb-10 |12     |300
A     |31-Mar-10 |200    |4,500
B     |31-Mar-10 |12     |300
A     |30-Apr-10 |200    |4,500
B     |30-Apr-10 |12     |300
A     |31-May-10 |200    |4,500
....

内部結合を使用してパッド付きテーブルを作成し、すべての会社と日付の一意のリストを作成したので、会社と日付の組み合わせの完全なリストを含む空のテーブルから効果的に見つめています。しかし、私はそこからどこから始めればよいのか悩んでいます。

私はこのプロジェクトにmysqlとRを使用しており、どちらの解決策/提案にも満足しています。データの量を考えると、かなり効率的な実装を探しています。

次の課題が存在します。1-会社は全期間にわたって存在しないため、最終期間の結果を無期限に(最大で2か月間)コピーしたくありません。同様に、初期の期間にデータがない企業もあります。2-レポート期間が異なるだけでなく、変更される可能性があるため、会社は最初は3月のカレンダーでレポートしますが、その後2月または1月に変更するため、コピーする前に、そのデータがすでにあるかどうかを確認する必要があります。存在します。

ご協力いただきありがとうございます。

4

2 に答える 2

5

最も簡単なのは、次の2か月間のデータをコピーすることですが、会社がレポートの日付を変更すると問題が発生します。

-- Pseudo-code
CREATE VIEW Tmp1 AS
SELECT Id, 
       Date AS Reported_Date, 
       Date, 
       Value1, Value2 
FROM QuarterlyData
UNION
SELECT Id, 
       Date AS Reported_Date, 
       Date + '1 month' AS Date, -- Replace this with correct date arithmetics
       Value1, Value2 
FROM QuarterlyData
UNION
SELECT Id, 
       Date AS Reported_Date, 
       Date + '2 months' AS Date, -- Replace this with correct date arithmetics
       Value1, Value2 
FROM QuarterlyData;

以下はより安全なはずです(そしてそれは毎日のデータにも機能します)。テーブルに必要な日付がすべてある場合は、最初に四半期データと結合します(レポートの日付が変更されたときに何が起こるかわからないため、データを6か月間保持します。 3ヶ月?)。

-- Pseudo-code
CREATE VIEW Tmp2 AS 
SELECT A.Id, 
       A.Date AS Reported_Date, 
       B.Date AS Date,
       A.Value1, A.Value2
FROM   Data A, Dates B
WHERE  B.Date <= A.Date 
AND    A.Date < B.Date + '6 months';

次に、重複を削除します。

CREATE VIEW Tmp_Dates_To_Keep AS
SELECT Id, Date, MAX(Reported_Date) AS Reported_Date 
FROM Tmp1;

SELECT A.Id, 
       A.Date, 
       A.Reported_Date, 
       Value1, Value2
FROM   Tmp2 A, Tmp_Dates_To_Keep B
WHERE  A.Id   = B.Id 
AND    A.Date = B.Date 
AND    A.Reported_Date = B.Reported_Date;
于 2012-04-08T10:01:14.227 に答える
0

DATE_ADDを使用して、実際の行を結合する仮想テーブルを作成します。

SELECT DATE_ADD('2013-01-01', INTERVAL 1 HOUR) UNION SELECT DATE_ADD('2013-01-01', INTERVAL 2 HOUR) UNION SELECT DATE_ADD('2013-01-01', INTERVAL 3 HOUR) UNION SELECT DATE_ADD('2013-01-01', INTERVAL 4 HOUR) ... etc
于 2015-03-22T13:34:07.037 に答える