현재 행과 다음 행 사이의 datediff를 계산하는 SQL Server 가장 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/52430

  •  09-06-2019
  •  | 
  •  

문제

다음과 같은 대략적인 구조가 있습니다.

Object -> Object Revisions -> Data

데이터는 여러 개체 간에 공유될 수 있습니다.

내가 하려는 것은 오래된 객체 개정을 정리하는 것입니다.일정 기간 동안 마지막 변경 사항이 유지되도록 첫 번째, 활성 및 확산된 개정판을 유지하고 싶습니다.데이터는 2일 동안 많이 변경된 후 몇 달 동안 그대로 유지될 수 있으므로 변경이 시작되기 전의 마지막 개정판과 새 세트의 마지막 변경 사항을 유지하고 싶습니다.

저는 현재 커서와 임시 테이블을 사용하여 변경 사항 사이의 ID와 날짜를 보관하므로 제거할 낮은 매달린 과일을 선택할 수 있습니다.이는 @LastID, @LastDate, 임시 테이블 업데이트 및 삽입 등을 사용하는 것을 의미합니다.

커서와 임시 테이블을 사용하지 않고 초기 결과 집합에서 현재 행과 다음 행 사이의 날짜 차이를 계산하는 더 쉽고/더 나은 방법이 있습니까?

저는 SQL Server 2000을 사용하고 있지만 이 문제에도 도움이 될 수 있는 2005, 2008의 새로운 기능에 관심이 있습니다.

도움이 되었습니까?

해결책

ID 열이 순차적인 경우 다음 접근 방식을 사용할 수 있습니다.

SELECT curr.*, DATEDIFF(MINUTE, prev.EventDateTime,curr.EventDateTime) Duration FROM DWLog curr join DWLog prev on prev.EventID = curr.EventID - 1

다른 팁

다음은 SQL 예입니다.ID 열이 있는 경우 "ActivityDate" 대신 이를 사용할 수 있습니다.

SELECT DATEDIFF(HOUR, prev.ActivityDate, curr.ActivityDate)
  FROM MyTable curr
  JOIN MyTable prev
    ON prev.ObjectID = curr.ObjectID
  WHERE prev.ActivityDate =
     (SELECT MAX(maxtbl.ActivityDate)
        FROM MyTable maxtbl
        WHERE maxtbl.ObjectID = curr.ObjectID
          AND maxtbl.ActivityDate < curr.ActivityDate)

"prev"를 제거할 수 있지만 삭제를 위해 ID가 필요하다고 가정하면 거기에 두십시오.

흠, 흥미로운 도전이네요.2005년에 새로 추가된 피벗 기능을 사용하면 셀프 조인 없이도 가능하다고 생각합니다.

지금까지 제가 얻은 정보는 다음과 같습니다. 답변을 수락하기 전에 조금 더 시간을 주고 싶었습니다.

DECLARE @IDs TABLE 
(
  ID int , 
  DateBetween int
)

DECLARE @OID int
SET @OID = 6150

-- Grab the revisions, calc the datediff, and insert into temp table var.

INSERT @IDs
SELECT ID, 
       DATEDIFF(dd, 
                (SELECT MAX(ActiveDate) 
                 FROM ObjectRevisionHistory 
                 WHERE ObjectID=@OID AND 
                       ActiveDate < ORH.ActiveDate), ActiveDate) 
FROM ObjectRevisionHistory ORH 
WHERE ObjectID=@OID


-- Hard set DateBetween for special case revisions to always keep

 UPDATE @IDs SET DateBetween = 1000 WHERE ID=(SELECT MIN(ID) FROM @IDs)

 UPDATE @IDs SET DateBetween = 1000 WHERE ID=(SELECT MAX(ID) FROM @IDs)

 UPDATE @IDs SET DateBetween = 1000 
 WHERE ID=(SELECT ID 
           FROM ObjectRevisionHistory 
           WHERE ObjectID=@OID AND Active=1)


-- Select out IDs for however I need them

 SELECT * FROM @IDs
 SELECT * FROM @IDs WHERE DateBetween < 2
 SELECT * FROM @IDs WHERE DateBetween > 2

나는 이것을 확장하여 최대한 많은 개정판을 유지하고 첫 번째, 마지막 및 활성 버전을 유지하면서 오래된 개정판을 잘라낼 수 있도록 노력하고 있습니다.select top 및 order by 절을 통해 충분히 쉬워야 합니다. 음...ActiveDate를 임시 테이블에 넣습니다.

나는 Peter의 예제를 작동하도록 얻었지만 이를 가져와 하위 선택으로 수정했습니다.나는 둘 다 엉망으로 만들었고 SQL 추적은 하위 선택이 더 적은 읽기를 수행하는 것을 보여줍니다.하지만 그것은 효과가 있고 내 평판이 충분히 높아지면 그를 투표할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top