0

これで、次のようなゲーム サマリー テーブルができました。

集計表

そして、「開始時間」と「終了時間」を時間単位で分割し、次の詳細な外観に変換したいと考えています。

私はこれを必要とする

Unpivot と似ていますが、まったく同じではありません。sql ステートメントはどのように記述すればよいですか? ありがとうございます!

4

3 に答える 3

3

PostgreSQLでは:

SELECT PlayerID
     , generate_series(s.StartTime, s.EndTime - 1) AS StartTimeCol
     , generate_series(s.StartTime + 1, s.EndTime) AS EndTimeCol
FROM summaryTable s

このリンクgenerate_seriesでは、SQLServer2008に関数を追加する方法を確認できます

ここで実際の動作を表示

于 2012-08-30T19:05:33.943 に答える
1

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 を参照してください

于 2012-09-07T17:27:15.160 に答える
1

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
于 2012-08-30T18:10:43.673 に答える