ゆっくりと変化する次元のような開始および終了データを持つさまざまなレコードを含むテーブルを通過するSQLコードです。ディメンションを確認しているうちに、開始日が終了日を過ぎていないことが判明しました。そこで、テーブルをループして、開始日と終了日を再作成して、開始日と終了日が実際に使用可能な日付の最小値/最大値であることを確認します。しかし、このプロセスは、900万行を処理するには時間がかかります。私はwhileループを使いたいが、min/max値を保持してIDのスイッチを検出することはできない。次のSQLコードでカーソルを置き換えるのを助けることができます
DECLARE @MINDDEB Datetime
DECLARE @DDEB Datetime
DECLARE @DFIN Datetime
DECLARE @CECV float
DECLARE @AIDNEBHNPRPEP int
DECLARE @CETA float
DECLARE @AIDNEBHNPRAFI int
DECLARE @MAXDFIN Datetime
DECLARE @OLDCECV float
DECLARE @OLDAIDNEBHNPRPEP int
DECLARE @OLDCETA float
DECLARE @OLDAIDNEBHNPRAFI int
SET @MINDDEB=9999-12-31
SET @MAXDFIN=1835-12-31
drop table dbo.TBYDWHTEBHNPRAFIVRS_CURSORTABLE
--T2
SELECT DDEB, DFIN, CETA,AIDNEBHNPRAFI
into dbo.TBYDWHTEBHNPRAFIVRS_CURSORTABLE
FROM dbo.TBYDWHTEBHNPRAFIVRS
WHERE AIDNEBHNPRAFI=-1
ORDER BY AIDNEBHNPRAFI,DDEB
DECLARE T2_CURSOR CURSOR FOR
select DDEB, DFIN, CETA,AIDNEBHNPRAFI
from TBYDWHTEBHNPRAFIVRS
where DFIN>DDEB and BRRDDEL<>1 and CSTUVRS = 1 --and AIDNEBHNPRAFI in (1080,1033143,2311904)
order by AIDNEBHNPRAFI,DDEB,CETA,CECV
OPEN T2_CURSOR
FETCH NEXT FROM T2_CURSOR
INTO @DDEB, @DFIN, @CETA,@AIDNEBHNPRAFI
SET @[email protected]
SET @[email protected]
--SET @[email protected]
WHILE @@FETCH_STATUS = 0
BEGIN
if (@[email protected] and @[email protected])
BEGIN
--print 'entering first if'
IF (@MINDDEB>@DDEB)
BEGIN
SET @[email protected]
END
IF (@MAXDFIN<@DFIN)
BEGIN
SET @[email protected]
END
END
--print ' OLD CECV '+convert(varchar(10),@OLDCECV) +' new CECV '+ convert(varchar(10),@CECV) +' OLDAID '+ convert(varchar(10),@OLDAIDNEBHNPRPEP) +' NEWAID '+ convert(varchar(10),@AIDNEBHNPRPEP)
-- +' NEWDDEB '+ convert(varchar(10),@DDEB,101) +' MINDDEB '+ convert(varchar(10),@MINDDEB,101) +' NEWDFIn '+ convert(varchar(10),@DFIN,101) +' MAXDFIN '+ convert(varchar(10),@MAXDFIN,101)
FETCH NEXT FROM T2_CURSOR
INTO @DDEB, @DFIN, @CETA,@AIDNEBHNPRAFI
if (@OLDCETA<>@CETA or @OLDAIDNEBHNPRAFI<>@AIDNEBHNPRAFI)
BEGIN
INSERT INTO TBYDWHTEBHNPRAFIVRS_CURSORTABLE (DDEB, DFIN, CETA,AIDNEBHNPRAFI)
VALUES (@MINDDEB,@MAXDFIN,@OLDCETA,@OLDAIDNEBHNPRAFI)
SET @[email protected]
--SET @[email protected]
SET @[email protected]
SET @[email protected]
SET @[email protected]
END
END
INSERT INTO TBYDWHTEBHNPRAFIVRS_CURSORTABLE (DDEB, DFIN, CETA,AIDNEBHNPRAFI)
VALUES (@MINDDEB,@MAXDFIN,@OLDCETA,@OLDAIDNEBHNPRAFI)
CLOSE T2_CURSOR;
DEALLOCATE T2_CURSOR;
これは
DDEB DFIN CETA AIDNEBHNPRAFI
2006-03-01 00ソースデータである:00:00.000 2006-04-30 23:59:59.000 1 231272
2006-05-01 00 :00:00.000 2006-11-30 23:59:59.000 1 231272
2006-12-01 00:00:00.000 2007-04-30 23:59:59.000 1 231272
2007-05-01 00:00 :00.000 2008-04-30 23:59:59.000 1 231272
2008-05-01 00:00:00 2008-08-31 23:59:59.000 1 231272
2008-09-01 00:00:00 。 000 2008-10-31 23:59:59.000 2 231272
2008-11-01 00:00:00.000 2009-04-30 23:59:59.000 1 231272
2009-05-01 00:00:00.000 2010 -01-31 23:59:59.000 1 231272
2010-02-01 00:00:00.000 9999-12-31 23:59:59.000 14 231272
、これは我々がカーソルで得た結果である
DDEB DFIN CETA AIDNEBHNPRAFI
2006-03-01 00:00:00.000 2008-08-31 23:59:59.000 1 231272
2008-09-01 00:00:00.000 2008-10-31 23: 59:59.0002 231272
2008-11-01 00:00:00.000 2010-01-31 23:59:59.000 1 231272
2010-02-01 00:00:00 9999-12-31 23:59:59 14 231272
質問を単純化して最小化するか、誰かを雇うかのどちらかです。 – jarlh
@jarlh、あなたのコメントは、*あなたが言う、または誰かを雇う* ... :) – Rahul
@Rahul、しかし私はこの誰かではありません。 – jarlh