2011-09-09 3 views
1

T-SQL에서만 가능하거나 C#으로 옮겨서 거기에서 수행해야하는지 잘 모르겠습니다. 다음과 같은 테이블 설정이 있습니다.T-SQL에서 사용할 수있는 형식으로 데이터를 조작하는 데 도움이 필요합니다.

Tracking 
-------- 
ID  int 
Hash varchar 
pageID int 

표는 사용자가 웹 사이트를 통해 여행하는 방식을 추적합니다. 모든 페이지로드 새 줄이 추가됩니다. 각 세션은 새로운 해시를 얻습니다. 예 데이터 :

1 3pm6Qav1Vdf 4 
2 3pm6Qav1Vdf 7 
3 3pm6Qav1Vdf 41 
4 3pm6Qav1Vdf 2 

그래서 세션의 흔적 (마지막 페이지로 첫 페이지를) 얻을 것이다 다음을 수행하는 것은 : 가능이 될 경우

SELECT * from Tracking WHERE hash='3pm6Qav1Vdf' ORDER BY ID; 

나는 좀하고 싶습니다 무엇 :

1 3pm6Qav1Vdf NULL 4 
2 3pm6Qav1Vdf  4 7 
3 3pm6Qav1Vdf  7 41 
4 3pm6Qav1Vdf 41 2 

이전 pageID와 현재 pageID를 나열하는 열을 추가합니다. 이게 T-SQL에서 가능하거나 C#으로 옮겨야합니까?

+1

AFAIK이 작업은 훨씬 쉬울 것입니다. CTE에 대해 자체 조인 할 필요가 없으므로 새로운 LAG/LEAD 창 함수 연산자를 사용할 수 있습니다. –

답변

1

이 CTE를 사용하면 이전 행에 액세스 할 수 있습니다. 원하는 경우 WHERE 절을 CTE 부분으로 옮길 수도 있고 전체 행 집합을 이전 값으로 가져올 수도 있습니다.

with cte as (
    select *, row_number() over (partition by hash order by id) as RN 
    from Tracking 
) 

select c.id, c.hash, cprev.id as previd, c.id 
from cte c 
    left join cte cprev on c.hash = cprev.hash and c.rn = cprev.rn + 1 
where 
    c.hash = 'yourhash' 
+1

특정 해시를 처리하고 있으므로 cte 내부를 필터링하지 않으시겠습니까? 파티션 할 필요가 없으며 결합 술어 중 하나를 제거합니다. –

3
DECLARE @hash VARCHAR(32); 

;WITH x AS 
(
    SELECT ID, pageID, rn = ROW_NUMBER() OVER (ORDER BY ID) 
    FROM dbo.Tracking 
    WHERE Hash = @hash 
) 
SELECT x.ID, Hash = @hash, PreviousPage = y.pageID, x.pageID 
    FROM x LEFT OUTER JOIN x AS y 
    ON x.rn = y.rn + 1 
    ORDER BY x.ID; 
관련 문제