1

次のようなテーブルがあります。次に従って、連続する行間の日付の差 (秒単位) を計算したい:

  • 日付が 1 日以上異なる場合は、差を計算します。
  • 日付が 1 日以上異なり、2 番目の日付の値が 84600 の連続した日がある場合、差を取る前に最初に日付を結合したい

現在、最初のケースを処理するために自己結合を行っていますが、2 番目のケースを処理する良い方法があるかどうかはわかりません。なにか提案を?

以下にも例を示します。

CREATE TABLE #TEMP(Person VARCHAR(100), StartTime Datetime, TotalSeconds INT)


INSERT INTO #TEMP VALUES('A',   '2013-02-20',   49800); -- We want to take the difference with the next row in this case
INSERT INTO #TEMP VALUES('A',   '2013-02-25',   3000); -- Before taking the difference, I want to first merge the next four rows because 5th March is followed by three days with the value 86400
INSERT INTO #TEMP VALUES('A',   '2013-03-05',   2100); 
INSERT INTO #TEMP VALUES('A',   '2013-03-06',   86400);
INSERT INTO #TEMP VALUES('A',   '2013-03-07',   86400);
INSERT INTO #TEMP VALUES('A',   '2013-03-08',   86400);
INSERT INTO #TEMP VALUES('A',   '2013-03-09',   17100);
INSERT INTO #TEMP VALUES('B',   '2012-04-24',   22500);
INSERT INTO #TEMP VALUES('B',   '2012-04-26',   600);
INSERT INTO #TEMP VALUES('B',   '2012-04-27',   10500);
INSERT INTO #TEMP VALUES('B',   '2012-04-29',   41400);
INSERT INTO #TEMP VALUES('B',   '2012-05-04',   86100);


SELECT *
FROM #TEMP

DROP TABLE #TEMP
4

1 に答える 1

2

以下は、2 番目のケースを処理します。

select Person, MIN(StartTime) as StartTime, MAX(StartTime) as maxStartTime
from (SELECT *,
             dateadd(d, - ROW_NUMBER() over (partition by person order by StartTime), StartTime) as thegroup
      FROM #TEMP t
     ) t
group by Person, thegroup

個人のすべての期間をグループ化し、連続する日付を 1 つの期間 (開始時刻と終了時刻) にまとめます。トリックは、 を使用してシーケンス番号を割り当ててrow_number()から、 との差を取ることStartTimeです。この差は、連続する日付のグループに対して一定です。したがって、外側のgroup by.

ステートメントを使用してwithこれをクエリに入れ、連続する行の間で必要な差を得ることができます。

于 2013-04-18T15:11:50.933 に答える