這是通過一個表的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.000 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.000 2 231272
2008-11-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
要麼簡化和最小化問題,要麼僱用某人。 – jarlh
@jarlh,你的評論看起來像廣告給我,因爲你說*或聘請某人* ... :) – Rahul
@Rahul,但我不是這個人。 – jarlh