これで、次のようなゲーム サマリー テーブルができました。
そして、「開始時間」と「終了時間」を時間単位で分割し、次の詳細な外観に変換したいと考えています。
Unpivot と似ていますが、まったく同じではありません。sql ステートメントはどのように記述すればよいですか? ありがとうございます!
SQL Server 2005 以降では、CTE を使用して結果を取得できます。
;with cte (playerid, starttime, endtime) as
(
select playerid, min(starttime) starttime, max(endtime) endtime
from yourtable
group by playerid
union all
select playerid, starttime + 1, endtime
from cte
where starttime < endtime
)
select playerid,
starttime,
case
when starttime + 1 < endtime
then starttime + 1
else endtime
end endtime
from cte
where starttime != endtime
order by playerid, starttime
デモで SQL Fiddle を参照してください
SQL Server を使用している場合は、次の TSQL ブロックを試すことができます。カーソルを使用して、開始時刻と終了時刻の間に 1 時間以上ある行をトラバースし、個々の「時間」を @gamesTable テーブル変数に追加して反復します。
カーソルが完了し、@gamesTable 変数にレコードが入力されると、開始時刻と終了時刻の間が 1 時間以下の行の元のテーブルに対する SELECT ステートメントが、@gamesTable に格納されたすべての行に結合されます。
DECLARE Game_Cursor CURSOR FOR
SELECT *
FROM summaryTable
WHERE EndTime - StartTime > 1
OPEN Game_Cursor;
DECLARE @PlayerID char
DECLARE @StartTime int
DECLARE @EndTime int
DECLARE @TempEndTime int
DECLARE @gamesTable TABLE(PlayerID char, StartTime int, EndTime int)
--Fetch the first row
FETCH NEXT FROM Game_Cursor INTO @PlayerID, @StartTime, @EndTime
WHILE @@FETCH_STATUS = 0
BEGIN
WHILE (@EndTime - @StartTime) > 0
BEGIN
SET @TempEndTime = @StartTime + 1
INSERT INTO @gamesTable
SELECT @PlayerID AS PlayerID, @StartTime AS StartTime, @TempEndTime AS EndTime
SET @StartTime = @StartTime + 1
END;
--Fetch the next row
FETCH NEXT FROM Game_Cursor INTO @PlayerID, @StartTime, @EndTime
END;
--Rid of the cursor
CLOSE Game_Cursor;
DEALLOCATE Game_Cursor;
--Output the results
SELECT * FROM summaryTable WHERE (EndTime - StartTime) <= 1
UNION ALL
SELECT * FROM @gamesTable