T-SQL, нужна помощь в обработке данных в форму, которую я могу использовать - PullRequest
1 голос
/ 09 сентября 2011

Я не уверен, возможно ли это только в T-SQL или мне следует перенести это в c # и сделать это там.У меня есть таблица настройки, например, так:

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 #?

Ответы [ 2 ]

3 голосов
/ 09 сентября 2011
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;
1 голос
/ 09 сентября 2011

Этот 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...