2016-10-07 28 views
1

建設プロジェクトのライフサイクル中のパネル状態に基づいて、余分な負荷を電力パネルに追加する効果を判断しようとしています。電源パネルには複数の負荷(最大240)が関連付けられていてもよく、これらの負荷は、いつでも構築スケジュールに基づいてインストールまたは削除することができます。パネルの負荷の合計は、プロジェクトのライフサイクルにわたって変動します。ロードが今日90%であるという理由だけで、新しいロードが明日にインストールされる予定であるため、自動的に10%の空き容量があることを意味しません。プロジェクトのライフサイクルは常に考慮する必要があります。集計複数の日付範囲に基づく値の合計 - SQL Server

パネル上のすべての負荷のインストール/アンインストールの日付に基づいて、指定された日付にパネルの最大負荷を決定するクエリが必要です。

次は、負荷とそのインストール/削除の日付のサンプルビューです。

CREATE TABLE #temp(
    PanelID  INTEGER NOT NULL 
    ,LOADID  INTEGER NOT NULL 
    ,Load  VARCHAR(7) NOT NULL 
    ,kVA   NUMERIC(5,2) NOT NULL 
    ,InstallDate DATE NOT NULL 
    ,DemoDate DATE 
); 
INSERT INTO #temp(PanelID,LOADID,Load,kVA,InstallDate,DemoDate) VALUES (1380,46706,'AUTO26',43.95,'07/07/1905','27/10/2016'); 
INSERT INTO #temp(PanelID,LOADID,Load,kVA,InstallDate,DemoDate) VALUES (1380,46706,'AUTO26',43.95,'07/07/1905','27/10/2016'); 
INSERT INTO #temp(PanelID,LOADID,Load,kVA,InstallDate,DemoDate) VALUES (1380,15539,'AUTO22',43.95,'01/01/2015',NULL); 
INSERT INTO #temp(PanelID,LOADID,Load,kVA,InstallDate,DemoDate) VALUES (1380,20188,'OVEN101',46.47,'29/06/2017',NULL); 
INSERT INTO #temp(PanelID,LOADID,Load,kVA,InstallDate,DemoDate) VALUES (1380,20186,'OVEN101',63.05,'29/06/2017',NULL); 
INSERT INTO #temp(PanelID,LOADID,Load,kVA,InstallDate,DemoDate) VALUES (1380,46705,'AUTO28',61.25,'07/07/1905','27/10/2016'); 
INSERT INTO #temp(PanelID,LOADID,Load,kVA,InstallDate,DemoDate) VALUES (1380,20186,'OVEN101',63.05,'29/06/2017',NULL); 
INSERT INTO #temp(PanelID,LOADID,Load,kVA,InstallDate,DemoDate) VALUES (1380,46705,'AUTO28',61.25,'07/07/1905','27/10/2016'); 
INSERT INTO #temp(PanelID,LOADID,Load,kVA,InstallDate,DemoDate) VALUES (1380,15539,'AUTO22',43.95,'01/01/2015',NULL); 
INSERT INTO #temp(PanelID,LOADID,Load,kVA,InstallDate,DemoDate) VALUES (1380,20188,'OVEN101',46.47,'29/06/2017',NULL); 
INSERT INTO #temp(PanelID,LOADID,Load,kVA,InstallDate,DemoDate) VALUES (1380,15538,'AUTO22',66.65,'01/01/2015',NULL); 
INSERT INTO #temp(PanelID,LOADID,Load,kVA,InstallDate,DemoDate) VALUES (1380,20187,'OVEN101',50.44,'29/06/2017',NULL); 
INSERT INTO #temp(PanelID,LOADID,Load,kVA,InstallDate,DemoDate) VALUES (1380,46704,'AUTO26',61.25,'07/07/1905','27/10/2016'); 
INSERT INTO #temp(PanelID,LOADID,Load,kVA,InstallDate,DemoDate) VALUES (1380,46707,'AUTO28',43.95,'07/07/1905','27/09/2016'); 
INSERT INTO #temp(PanelID,LOADID,Load,kVA,InstallDate,DemoDate) VALUES (1380,15538,'AUTO22',66.65,'01/01/2015',NULL); 
INSERT INTO #temp(PanelID,LOADID,Load,kVA,InstallDate,DemoDate) VALUES (1380,20187,'OVEN101',50.44,'29/06/2017',NULL); 
INSERT INTO #temp(PanelID,LOADID,Load,kVA,InstallDate,DemoDate) VALUES (1380,46704,'AUTO26',61.25,'07/07/1905','27/10/2016'); 
INSERT INTO #temp(PanelID,LOADID,Load,kVA,InstallDate,DemoDate) VALUES (1380,46707,'AUTO28',43.95,'07/07/1905','27/09/2016'); 

日に私のソリューションは、パネル上の負荷に関連したすべての与えられた日に、パネルの荷重(和またはキロボルトアンペア)を見つけるために、カーソルを使用することでした。パネルに最大240の負荷がかかる可能性があるため、パフォーマンスが大幅に低下します。

これを行うには良い方法がありますか?

編集:推奨するようにcreate tableを簡略化しました。パネルでグループ化してkVA列を合計するだけで結果を取得することができます。しかし、パネル上の各Loadのインストール日に基づいています。アンインストール日付がインストール日よりも小さい場合、それは集約機能には表示されません。

+1

サンプルコードは実行されません。主キー違反が発生しています。一意にする必要がある場合は、複数の1375 SourceIDがあります。 –

+0

あなたはより良い応答を得るためにあなたの質問で2つのことをする必要があると思います。一時テーブル作成のアプローチは良いですが、フィールドを見て、問題を表現するためにそれらをすべて必要とし、それらの行をすべて必要としますか?したがって、サンプルデータを最小要件に単純化してから、出力がどのように見えるかを指定します。また、あなたの現在の試みは役に立ちます。 – Tanner

+0

また、私は英国にいるので、取得:*文字列。*から日付や時刻を変換するときに変換に失敗しました.yyyymmdd'のような日付をフォーマットするのに最適です.SQLはこれを常に理解します。 – Tanner

答えて

1

私は、DemoDateがボードから負荷が削除された日付であり、nullは削除されていないことを意味します。ここでは、期間にわたって最大kVAを与える共通のテーブル式クエリがあります。

SET DATEFORMAT dmy; 

CREATE TABLE #temp(
    SourceID  INTEGER  NOT NULL 
    ,PanelID  INTEGER  NOT NULL 
    ,BP_DP   INTEGER  NOT NULL 
    ,depth   BIT   NOT NULL 
    ,LOADID   INTEGER  NOT NULL 
    ,Load   VARCHAR(7)  NOT NULL 
    ,kVA   NUMERIC(5,2) NOT NULL 
    ,InstallDate DATE   NOT NULL 
    ,DemoDate  DATE 
); 

INSERT INTO #temp 
    (SourceID, PanelID, BP_DP, depth, LOADID, Load,  kVA, InstallDate, DemoDate ) 
VALUES 
    (1375,  1380, 2,  1,  46706, 'AUTO26', 43.95, '07/07/1905', '27/10/2016'), 
    (1380,  1380, 2,  0,  46706, 'AUTO26', 43.95, '07/07/1905', '27/10/2016'), 
    (1375,  1380, 2,  1,  15539, 'AUTO22', 43.95, '01/01/2015', NULL  ), 
    (1375,  1380, 2,  1,  20188, 'OVEN101', 46.47, '29/06/2017', NULL  ), 
    (1380,  1380, 2,  0,  20186, 'OVEN101', 63.05, '29/06/2017', NULL  ), 
    (1380,  1380, 2,  0,  46705, 'AUTO28', 61.25, '07/07/1905', '27/10/2016'), 
    (1375,  1380, 2,  1,  20186, 'OVEN101', 63.05, '29/06/2017', NULL  ), 
    (1375,  1380, 2,  1,  46705, 'AUTO28', 61.25, '07/07/1905', '27/10/2016'), 
    (1380,  1380, 2,  0,  15539, 'AUTO22', 43.95, '01/01/2015', NULL  ), 
    (1380,  1380, 2,  0,  20188, 'OVEN101', 46.47, '29/06/2017', NULL  ), 
    (1375,  1380, 2,  1,  15538, 'AUTO22', 66.65, '01/01/2015', NULL  ), 
    (1375,  1380, 2,  1,  20187, 'OVEN101', 50.44, '29/06/2017', NULL  ), 
    (1375,  1380, 2,  1,  46704, 'AUTO26', 61.25, '07/07/1905', '27/10/2016'), 
    (1375,  1380, 2,  1,  46707, 'AUTO28', 43.95, '07/07/1905', '27/10/2016'), 
    (1380,  1380, 2,  0,  15538, 'AUTO22', 66.65, '01/01/2015', NULL  ), 
    (1380,  1380, 2,  0,  20187, 'OVEN101', 50.44, '29/06/2017', NULL  ), 
    (1380,  1380, 2,  0,  46704, 'AUTO26', 61.25, '07/07/1905', '27/10/2016'), 
    (1380,  1380, 2,  0,  46707, 'AUTO28', 43.95, '07/07/1905', '27/10/2016'); 

WITH cte 
AS 
(
    SELECT 
     t1.PanelID, 
     t1.InstallDate, 
     SUM(t2.kVA) LoadAferInstall 
    FROM 
     (SELECT DISTINCT 
      PanelID, 
      InstallDate 
     FROM 
      #Temp 
     ) t1 
     JOIN #Temp t2 
      ON t1.PanelID = t2.PanelID 
      AND t2.InstallDate <= t1.InstallDate 
      AND (t2.DemoDate IS NULL OR t2.DemoDate >= t1.InstallDate) 
    GROUP BY 
     t1.PanelID, t1.InstallDate 
) 
SELECT 
    PanelID, 
    MAX(LoadAferInstall) MaxPanelLoad_kVA 
FROM 
    cte 
GROUP BY 
    PanelID 
; 

DROP TABLE #temp 
+0

これはほぼ正しいです。しかし、結果を合計する前に行を複製しているようです。何かご意見は? – user1781272

+0

あなたの前提は正確です。ただし、最後の集計を削除して1905-07-07の合計負荷を確認すると、合計は3360になります。これは961にする必要がありますか? – user1781272

+0

重複を削除する例を更新しました。しかし、私はあなたが961をどこから手に入れているのか分かりません。最初の日付は1905-07-07で、この日の合計負荷はそのInstallDateを持つすべての行の合計にすぎませんか?この合計は420.80です。 –

関連する問題