2

アクティビティの開始時間と終了時間に対応するタイムスタンプのみを使用して、1 日の 15 分間隔ごとに発生したアクティビティの合計量を計算するクエリを作成したいと考えています。

サンプル データ セットを次に示します。

    DATE    StartDateTime   StopDateTime
2/2/2015    2/2/2015 7:00   2/2/2015 7:25
2/2/2015    2/2/2015 7:20   2/2/2015 7:29
2/2/2015    2/2/2015 7:35   2/2/2015 7:42
2/2/2015    2/2/2015 8:05   2/2/2015 8:14
2/2/2015    2/2/2015 8:16   2/2/2015 8:20
2/2/2015    2/2/2015 8:29   2/2/2015 8:40
2/2/2015    2/2/2015 8:55   2/2/2015 9:25

そして、これは私が手に入れたいものです:

    DATE    Interval       activityTime(min)
2/2/2015    2/2/2015 7:00   15
2/2/2015    2/2/2015 7:15   19
2/2/2015    2/2/2015 7:30   7
2/2/2015    2/2/2015 7:45   0
2/2/2015    2/2/2015 8:00   9
2/2/2015    2/2/2015 8:15   5
2/2/2015    2/2/2015 8:30   10
2/2/2015    2/2/2015 8:45   5
2/2/2015    2/2/2015 9:00   15
2/2/2015    2/2/2015 9:15   10

私は必要な方法でデータを整理する方法を見つけるために検索しました.

t-sqlで時間+期間を間隔に分割する

私はSQLにかなり慣れていないので、ソリューションの説明は大歓迎です。これは、stackoverflow に関する私の最初の投稿でもあります。データが適切な形式でない場合、または追加の質問がある場合はお知らせください。ありがとう!

4

2 に答える 2

1

次のクエリは、少なくとも 1 つの開始時刻を含む 15 分の各増分と、その 15 分の増分で開始された期間全体のアクティビティの合計量 (分単位) を提供します。

select  Date,
        Convert( SmallDatetime, Floor( Cast( StartDateTime as float ) * 96.0 ) / 96.0 ) Increment,
        Sum( DateDiff( second, StartDateTime, StopDateTime )) / 60 Duration
from    Activities
group by Date, Convert( SmallDatetime, Floor( Cast( StartDateTime as float ) * 96.0 ) / 96.0 );

これはこれを返します:

Date       Increment           Duration
---------- ------------------- --------
2015-02-02 2015-02-02 07:00:00 25
2015-02-02 2015-02-02 07:15:00  9
2015-02-02 2015-02-02 07:30:00  7
2015-02-02 2015-02-02 08:00:00  9
2015-02-02 2015-02-02 08:15:00 15
2015-02-02 2015-02-02 08:45:00 30

次のインクリメントへのオーバーフローを使用して実行中の合計を計算することを検討していたところ、カップラが発生しました。1 つは、アクティビティが開始されるかどうかに関係なく、クエリの実行中に 15 分ごとにインクリメントする必要があることです。そのため、タリー テーブルを使用して、前の間隔からのオーバーフロー分をキャッチするために、すべての間隔が生成されるようにする必要があります。

次に、もちろん、オーバーフローを使用して実行中の合計を追跡します。これは可能ですが ( https://stackoverflow.com/a/861073/3658753を参照してください)、この 2 つの組み合わせ (集計テーブルと実行中の合計) が非常に多くのオーバーヘッドになることがわかりました。 SQL で実行されます。SQL で計算を実行すると、最速のディスク アクセスよりも何倍も高速になりますが、任意の高級言語 (Java、C++、C#、または Perl などのスクリプト言語) で計算を実行すると、SQL よりも何倍も高速になります。さらに、SQL ソリューションの保守性は、地下深くにあるでしょう。

したがって、この時点での私の推奨事項は、上記のクエリを使用して、優れたレポート エンジンまたはアプリケーションにフィードし、追加の計算を実行させることです。パフォーマンスに関しては、あなたはずっと先を行くでしょう。

于 2015-04-09T04:55:47.530 に答える