質問: tmp1.日時 AND t.種別 <= tmp1.種別)) AS 残リソース FROM tmp1 ``` | チームID | 日時 | 残リソース | | --- | --- | --- | | A | 2018/09/21 10:00:00 | 3 | | A | 2018/09/21 11:00:00 | 1 | | A | 2018/09/21 14:00:00 | 3 | | A | 2018/09/21 15:00:00 | 5 | * 時間帯毎の残リソースを算出する ``` CREATE VIEW RemainResource (チームID, 開始日時, 終了日時, 残リソース, 作業可能時間) AS SELECT tmp3.* ,DATEDIFF(ss,tmp3.開始日時,tmp3.終了日時) AS 作業可能時間 FROM (SELECT MAX(tmp2.チームID) AS チームID ,CASE WHEN MAX(t.日時) IS NULL THEN CONVERT(datetime, CONVERT(char(8), MAX(tmp2.日時), 112) + '06:00:00') --6時の情報は、別テーブルに定義した値をSELECTします。 ELSE MAX(t.日時) END AS 開始日時 ,MAX(tmp2.日時) AS 終了日時 ,MAX(tmp2.残リソース) AS 残リソース FROM tmp2 LEFT OUTER JOIN tmp2 AS t ON t.日時 < tmp2.日時 GROUP BY tmp2.日時) AS tmp3 ``` | チームID | 開始日時 | 終了日時 | 残リソース | 作業可能時間 | | --- | --- | --- | --- | --- | | A | 2018/09/21 06:00:00 | 2018/09/21 10:00:00 | 5 | 14400 | | A | 2018/09/21 10:00:00 | 2018/09/21 11:00:00 | 3 | 3600 | | A | 2018/09/21 11:00:00 | 2018/09/21 14:00:00 | 1 | 10800 | | A | 2018/09/21 14:00:00 | 2018/09/21 15:00:00 | 3 | 3600 | ※上記クエリでは、2018/09/21 15:00:00~2018/09/22 06:00:00までの残リソースが5という情報は出力できていません。 かなり長々としたクエリになり、且つ計画済トランザクションのデータが多いとパフォーマンスにも影響を与えると思い、 別の手段がないかと今回質問させていただきました次第です。 正直、Viewだけでは厳しいのかと思っており、ストアドで計画済トランザクションをカーソルで探索する方法の方が良いのか?とも思っています。 どうか知恵をお貸しいただけないでしょうか。 ### 補足情報(FW/ツールのバージョンなど) SQL Server 2014
回答: 具体的な内容での回答にするには時間が掛かりそうなので、アイデアだけ。 「計画済タスクトランザクション」の行間や起点や終点の間が、「残リソース」と言えると思います。 window関数のlag()やlead()を使用すれば行間などの残リソースが作り出せるのではないかと思います。 ただ、込み入った仕様のようですので、考え方は同じですが、結局は「計画済タスクトランザクション」のフェッチループ内で色んな判定を行うストアドになりそうな気はします。