1

質問に対して、次のデータを保持するテーブルがあるとしましょう。

1)名前2)気分3)日時

次のようなレコードを挿入できます:

Andy    Happy    '11.06.2012 - 14.06.07' -- Inserted on 11.06.2012 @ 19:12.32
Arthur  Angry    '11.06.2012 - 15.06.57' -- Inserted on 11.06.2012 @ 17:12.32
Andy    Sad      '11.06.2012 - 14.34.05' -- Inserted on 11.06.2012 @ 17:12.32
Arthur  Happy    '11.06.2012 - 13.34.05' -- Inserted on 11.06.2012 @ 14:12.32

これらの気分の変化に関連する「期間」情報を取得したいです!

私のテーブルには数千または数千のレコードがあり、時間がかかりすぎるプロセスを持つ余裕はありません。これを計算する最良の方法は何でしょうか?

  • 「挿入後」をトリガーし、「期間」列に入力しますか?
  • 以前に作成された「期間」列を埋めるストアドプロシージャ?
  • 計算列?
  • ビュー(私はすでにそれを試しましたが、表示するのに2秒以上かかりますが、これはまったく受け入れられません)
  • 別のアイデア?

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

重要な編集:ムードレコードはパケットにグループ化されて到着し、すでに挿入されているレコードの日付が小さいことを確認できません。(私の記録の横にある上記のコメントを参照してください)

4

1 に答える 1

3

考えられる SQL バージョン:

WITH CTE AS(
    SELECT ROW_NUMBER()OVER(PARTITION BY [Name] ORDER BY [Time])As RowNum
    , *
    FROM @table T
)
SELECT 
    DiffSec=DATEDIFF(s,[Time],(SELECT [Time] FROM CTE c2 WHERE c2.[Name]=CTE.[Name] AND c2.RowNum=CTE.RowNum+1))
    , [Name]
    , Mood
    , [Time]
FROM CTE 
ORDER BY [Name],[RowNum]

結果:

DiffSec Name    Mood    Time
1678    Andy    Happy   2012-06-11 14:06:07.000
NULL    Andy    Sad     2012-06-11 14:34:05.000
5228    Arthur  Angry   2012-06-11 14:06:57.000
NULL    Arthur  Happy   2012-06-11 15:34:05.000

テストデータ:

declare @table table(name varchar(10),mood varchar(10),time datetime);
insert into @table values('Andy','Happy',convert(datetime,'11.06.2012 14:06:07',104));
insert into @table values('Arthur','Angry',convert(datetime,'11.06.2012 14:06:57',104));
insert into @table values('Andy','Sad',convert(datetime,'11.06.2012 14:34:05',104));
insert into @table values('Arthur','Happy',convert(datetime,'11.06.2012 15:34:05',104));

Edit Self-Joining はCTE非常に悪い考えのようです ( CTE に自分で参加すると死ぬ )。一時テーブルで 500000 レコードを使用してクエリをテストし、30 分後にクエリをキャンセルしました。

これは、サブクエリを使用した(コメントされたスキーマを使用した)はるかに高速なアプローチ(すべてで4秒)です。

SELECT T.*
    ,(SELECT DATEDIFF(s,MAX(T2.Time),T.Time)
      FROM dbo.Temp T2
      WHERE T2.HE_Id = T.HE_Id
          AND T2.Time < T.Time
    ) AS DiffSec
FROM dbo.Temp AS T
ORDER BY HE_Id ,DiffSec
于 2012-06-11T13:39:24.733 に答える