Группа не работает с курсором - PullRequest
3 голосов
/ 13 декабря 2011

рассмотрим следующий запрос.Я создал курсор для этого запроса.Моя проблема заключается в группировке, которая не работает должным образом в курсоре. Но когда я выполняю запрос, он дает идеальную группу по результату.

, когда я повторяю курсор, используя цикл 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

Ответы [ 2 ]

2 голосов
/ 13 декабря 2011

Это способ сказать, что ваша база данных "Пожалуйста, не используйте курсор на меня". : 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 

Кроме того, если ваш SELECT не выполняет другие действия, которые мы здесь не видим, то в 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'
1 голос
/ 13 декабря 2011

Не уверен, поможет ли это вам, но это, по крайней мере, более точно.

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
...