2011-12-13 18 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