2013-05-02 5 views
0

У меня есть эта таблицаразница в днях между двумя записями

User | days 
A | 1 
A | 1 
A | 2 
B | 2 
B | 5 

, и я хотел бы иметь

User | difference_in_day 
A | 0 
A | 1 
B | 3 

Я думаю, что я должен сделать автообъединение, но я не» t знать, как сравнивать строку с следующей.

Нужно ли добавлять положение строки в первую таблицу с этим условием? :

WHERE a.row_position+1=b.row_position 
+0

, какую базу данных вы используете? – paul

+0

Я работаю над Microsoft Sql Server – Ricol

+0

Если вы сравниваете одну строку со следующей строкой, вы полагаетесь на данные, поступающие в определенном порядке. Есть ли поле идентификатора или поле SortBy в вашей таблице, которое вы можете использовать? Если нет, то вы не можете предположить, что при повторном запросе ваш заказ будет таким же. –

ответ

0

Пожалуйста, попробуйте:

;with T as(
    select *, ROW_NUMBER() over (order by User, Days) Rnum from YourTable 
) 
select 
    distinct a.User, 
    b.Days-a.Days difference_in_day 
from T a left join T b on a.Rnum=b.Rnum-1 
where b.User is not null 

Образец

declare @tbl as table(xUser nvarchar(1), xDays int) 
insert into @tbl values 
('A', 1), 
('A', 1), 
('A', 2), 
('B', 2), 
('B', 5) 

select *, ROW_NUMBER() over (order by xUser, xDays) Rnum from @tbl 

;with T as(
    select *, ROW_NUMBER() over (order by xUser, xDays) Rnum from @tbl 
) 
select 
    distinct a.xUser, 
    b.xDays-a.xDays difference_in_day 
from T a left join T b on a.Rnum=b.Rnum-1 
where b.xUser is not null 
Смежные вопросы