2011-12-13 43 views
2

請考慮以下查詢。 我爲此查詢創建了一個遊標。 我的問題是group by在光標中不能正常工作。但是當我執行查詢時,它會根據結果給出完美組。通過不與光標一起工作組

當我使用FETCH NEXT和WHILE循環迭代遊標時,它爲相同的point_id提供了多個組。

你能幫我解決這個問題嗎? 在此先感謝..

select timestamp as 'TS',REPLACE(REPLACE(POINT_ID,'[','_'),']','_') AS POINT_ID,_VAL 
from TCF1_PULLCORD 
where timestamp between '11/01/2011 6:30:00 AM' and '12/01/2011 6:29:59 AM' 
group by point_id,timestamp,_val 


DECLARE MYCUR CURSOR 
FOR 
    select timestamp as 'TS',REPLACE(REPLACE(POINT_ID,'[','_'),']','_') AS POINT_ID,_VAL 
    from TCF1_PULLCORD 
    where timestamp between '11/01/2011 6:30:00 AM' and '12/01/2011 6:29:59 AM' 
    group by point_id,timestamp,_val 
+0

你是什麼意思 – gbn

+0

它給ROWS FOR POINT_ID = 'DOOR_PROD_ST_1_' 「不是在光標正常工作」 THEN給出POINT_ID = 'DOOR_PROD_ST_10_' AND 'DOOR_PROD_ST_11_'然後再'DOOR_PROD_ST_1 _'...我平均分組 – Dharmesh

+0

@Dharmesh:請將** ** **大寫鎖定鍵**關閉** - 這是考慮** YELLING **,它是* * RUDE ** –

回答

2

這是您的數據庫的說法「請不要在我身上使用光標」。 :D

只是在開玩笑,但在所有的嚴肅性中,您會發現遍歷表變量的迭代效果要比使用遊標更好。

DECLARE @timestamps TABLE( 
    TS DATETIME, 
    POINT_ID VARCHAR(100), 
    _VAL VARCHAR(100) 
    ) 
DECLARE @currTimeStamp DATETIME 

INSERT INTO @timestamps 
select timestamp as 'TS',REPLACE(REPLACE(POINT_ID,'[','_'),']','_') AS POINT_ID,_VAL 
from TCF1_PULLCORD 
where timestamp between '11/01/2011 6:30:00 AM' and '12/01/2011 6:29:59 AM' 
group by point_id,timestamp,_val 


WHILE (SELECT COUNT(TS) FROM @timestamps > 0) 
BEGIN 
    SELECT @currTimeStamp = MIN(TS) FROM @timestamps 
    --Do work here 
    ... 

    --Delete the timestamp we just worked on 
    DELETE FROM @timestamps WHERE TS = @currTimeStamp 
END 

此外,除非你是選擇做其他的事情,我們不能在這裏看到,在GROUP BY應該是不必要的。如果您沒有執行任何聚合函數(例如SUM,MAX,MIN),並且您只是試圖獲得唯一的組合,那麼SELECT DISTINCT是更有效的方法。

在這種情況下,你的選擇會是:

select DISTINCT timestamp as 'TS',REPLACE(REPLACE(POINT_ID,'[','_'),']','_') AS POINT_ID,_VAL 
from TCF1_PULLCORD 
where timestamp between '11/01/2011 6:30:00 AM' and '12/01/2011 6:29:59 AM' 
+0

親愛的喬納森。你教會了我一個很好的方法,但是它在處理44021行時花費了太多時間(超過5分鐘)。當我用select語句顯示@timestamps表時,它給了我完美的結果[「INSERT INTO @timestamps」]。所以你的建議可以完美適用於小結果(1000-2000)行 – Dharmesh

+0

它變得更快時,我使用EXISTS(SELECT * FROM @timestamps)。非常感謝Jonathan – Dharmesh

+0

是的,在某些情況下,EXISTS可以更快。在@timestamps中添加PRIMARY KEY也可能在許多情況下提高性能。答案的優化總是一種猜測,除非你掌握了實際的數據。 –

1

不知道這是否會幫助你,但它至少是更準確。

DECLARE MYCUR CURSOR 
FOR 
    select timestamp as 'TS' 
      ,REPLACE(REPLACE(POINT_ID,'[','_'),']','_') AS POINT_ID 
      ,_VAL 
    from TCF1_PULLCORD 
    where timestamp between '11/01/2011 6:30:00 AM' and '12/01/2011 6:29:59 AM' 
    group by 
      REPLACE(REPLACE(POINT_ID,'[','_'),']','_') 
      ,timestamp 
      ,_val 
+0

謝謝Johan。但它不工作... – Dharmesh