QA@IT

トランザクションで日時の同じデータを拾ったテーブルを返したい

6973 PV

実は、ストアドプロシージャなども初心の者です。取り掛かったものの、どこに必要な情報があるのかさえ見つけられずに悶々としておりましたが、思い切って、お尋ねしたいと思いました。

コピペを含め、下記のように、処理の流れの枠を設けました。修正していただけますと、ありがたいと思っています。

USE Articles
GO

-- データベース名はArticlesです。
-- ID int primary key
-- Title nvarchar(120)
-- InputTime datetime

/* -------------------------------------------------------
初めに、テーブルをID順にソートするところから始めます。
*/ -------------------------------------------------------

CREATE procedure sp_TranFindSameTime as

--変数リストの宣言
DECLARE @ID int
DECLARE @Title nvarchar(120)
DECLARE @InputTime datetime

--カーソルの宣言
DECLARE AtcCur cursor FOR
SELECT ID, Title, InputTime
FROM Articles AS atc
ON atc.ContactID = atc.ContactID

--カーソルを開く
OPEN AtcCur

--FETCH(行の取り出し)
FETCH NEXT
FROM AtcCur INTO @ID,
@Title,
@InputTime

BEGIN TRY
BEGIN TRANSACTION --トランザクションの開始
--ループ
WHILE (@@fetch_status = 0)
BEGIN
--変数リストからINSERT文の実行
INSERT INTO TranTest
VALUES
(@ID,
@Title,
@InputTime)
--FETCH(行の取り出し)
FETCH NEXT
FROM AtcCur INTO @ID,
@Title,
@InputTime

/* -------------------------------------------------------------------------------------------
ここのループ処理の中に、カーソル位置の次のInputTimeがカーソル位置のInputTimeと同じデータが
ある場合には、「カーソル位置の次のInputTime」に5分加える処理をする。

または、ここのループ処理の中に、上下のInputTimeの同じデータをテーブルに転記することで、
InputTimeの同じデータがあった時には、最後に同一InputTimeの行のテーブルをアプリに返したい。

*/ -------------------------------------------------------------------------------------------
End
COMMIT TRANSACTION --トランザクションを確定
END TRY

--例外処理
BEGIN CATCH
ROLLBACK TRANSACTION --トランザクションを取り消し
PRINT ERROR_MESSAGE() --エラー内容を戻す
PRINT 'ROLLBACK TRANSACTION'
END CATCH

--カーソルを閉じる
CLOSE AtcCur
DEALLOCATE AtcCur

RETURN

個々の質問については、コードの中のコメント欄に挿入させていただいております。
いかがでしょうか? ループの方法やIF文の活用についても、まだ分からないままの質問のとなってしまいましたが、どうか教えて頂けますと、助かります。
この後、ここで処理したデータを別アプリで使おうと思っております。

よろしくお願い致します。

  • DB のことを質問しているようですが、であればその DB が何か(SQL Server?, Oracle? MySQL? その他?)という情報はどこかに書いてあるのでしょうか? -
  • 大変失礼いたしました。SQL Server 2017を利用させていただいております。 -

回答

Select *, (ROW_NUMBER() OVER(PARTITION BY InputTime ORDER BY ID) -1) tm_no
From _tbl1
Order By InputTime, tm_no

これでSelectすれば tm_no に同じInputTimeでの順番がセットされるので
tm_no * 5分をたしてあげればよいかと思います。

ただし、足すことにより次のInputTimeと同じになったり超えてしまうこともあるので
その場合を考慮するのであれば複雑になります。

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。