2013-05-22 2 views
0

У меня есть следующая таблица:SQL запрос, чтобы вернуть разницу между записями двух последних дат

**TABLE1** 

RecordID UserID  UserName  Balance  TranDate 
--------------------------------------------------------------- 
100   10001  John Doe  10213.00 2013-02-12 00:00:00.000 
101   10001  John Doe  1932.00 2013-04-30 00:00:00.000 
102   10001  John Doe  10213.00 2013-03-25 00:00:00.000 
103   10001  John Doe  14514.00 2013-04-12 00:00:00.000 
104   10001  John Doe  5430.00 2013-02-19 00:00:00.000 
105   10001  John Doe  21242.00 2010-02-11 00:00:00.000 
106   10001  John Doe  13342.00 2013-05-22 00:00:00.000 

Теперь то, что я пытаюсь сделать, это запросить две последние операции и прийти к этим данным :

RecordID UserID  UserName  Balance  TranDate 
--------------------------------------------------------------- 
106   10001  John Doe  13342.00 2013-05-22 00:00:00.000 
101   10001  John Doe  1932.00 2013-04-30 00:00:00.000 

Затем, используя данные выше, я хотел бы сравнить балансы, чтобы показать разницу:

UserID  UserName  Difference 
--------------------------------------------------------------- 
10001  John Doe  -11410.00 

Это просто показывает разницу между двумя предыдущими балансами (последние и весы до последнего)

Теперь у меня следующий запрос ниже. Это хорошо работает, чтобы показать две последние транзакции.

SELECT 
TOP 2 * 
    FROM Table1 
WHERE UserID = '1001' 
ORDER 
    BY TranDate DESC 

Теперь мои вопросы:

  1. ли SQL выше безопасно использовать? Я просто полагаюсь на сортировку TranDate по ключевому слову ORDER BY DESC, и я не уверен, что это очень надежно или нет.

  2. Как выбрать разницу между двумя балансами (строка 2 - строка 1)? Я искал некоторые ответы в Интернете, и я нахожу материал о том, как присоединяться. Я попробовал, но это не показывает мне мой желаемый результат.

EDIT:

Это ближайший я могу добраться до нужного мне результата. Может кто-нибудь помочь мне в этом, пожалуйста? Благодаря!

DECLARE @SampleTable TABLE 
(
UserID  INT, 
UserName  VARCHAR(20), 
Balance  DECIMAL(9,2) DEFAULT 0 
) 

INSERT 
    INTO @SampleTable 
     (UserID, UserName, Balance) 
SELECT 
TOP 2 UserID, 
     UserName, 
     Balance 
    FROM Table1 
WHERE UserID = '1001' 
ORDER 
    BY TranDate DESC 


SELECT A.UserID, 
     A.UserName, 
     B.Balance - A.Balance AS Difference 
    FROM @SampleTable A 
    JOIN @SampleTable B 
    ON A.UserID = B.UserID  

Большое спасибо!

ответ

0

Вы должны быть в состоянии использовать что-то вроде следующего предполагающей SQL Server в качестве СУБД:

;with cte as 
(
    select recordid, userid, username, balance, trandate, 
    row_number() over(partition by userid order by trandate desc) rn 
    from table1 
) 
select c1.userid, c1.username, 
    c1.balance - c2.balance diff 
from cte c1 
cross apply cte c2 
where c1.rn = 1 
    and c2.rn = 2; 

См SQL Fiddle with demo.

Или это может быть сделано с помощью внутреннего соединения на величину row_number:

;with cte as 
(
    select recordid, userid, username, balance, trandate, 
    row_number() over(partition by userid order by trandate desc) rn 
    from table1 
) 
select c1.userid, c1.username, 
    c1.balance - c2.balance diff 
from cte c1 
inner join cte c2 
    on c1.rn + 1 = c2.rn 
where c1.rn = 1 

SQL Fiddle with Demo См

+0

Спасибо! Это именно то, что мне нужно! Я просто сделал несколько хитростей, чтобы сузить результаты, и все работает отлично! – Smiley

Смежные вопросы