2015-03-18 4 views
0

У меня есть набор данных ниже, и вам нужно довести его до уровня, где он показывает одну строку в день на человека за идентификатор продукта. С конечной целью можно сравнить первый предыдущийStat на основе tranTime с самым последним currentStat.Как сравнить значения в разных строках и разных столбцах в SQL Server 2008

tranDate productID tranTime previousSTAT currentSTAT  FIRSTNAME 
    20140221 47444  10533900 NULL    U    SHAUN       
    20140221 47444  10553700 U     U    SHAUN       
    20140304 47444  11133300 U     U    TIMOTHY      
    20140304 47444  11204900 U     U    TIMOTHY 
    20140305 47444  9133300  U     Y    TIMOTHY      
    20140305 47444  9204900  Y     Y    TIMOTHY      

В соответствии с ниже:

tranDate productID  previousSTAT currentSTAT  FIRSTNAME 
    20140221 47444   NULL    U    SHAUN 
    20140304 47444   U     U    TIMOTHY           
    20140305 47444   U     Y    TIMOTHY      

Любая помощь, которую люди могут предоставить будут оценены.

С уважением, Gabbaii

+3

Только в '' Group By на колоннах, которые вы требовали, как 'выбрать ... из .. где ... Группа по Trandate, ProductID, previousstat, currentstat, firstname' –

+0

Пример не является лучшим, потому что он не объясняет, как tranTime влияет на вещи, но если вы находитесь на SQL Server 2012 или новее, функция LAG может вам помочь. –

+0

tranTime указывает, когда произошла транзакция. Поэтому в конечном состоянии я хочу сравнить первое значение предыдущегоStat с последним значением currentStat. – GaBBaii

ответ

0

Как насчет присвоения номеров строк в каждой группе вы заинтересованы, так что номер строки один представляет собой первую линию? Затем сделайте то же самое, но с обратным порядком, чтобы строка номер один представляла последнюю строку. Затем соедините эти две таблицы вместе. Что-то вроде:

With minvalues as 
(Select tranDate,productId, previousStat, firstname, row_number() 
over (partition by tranDate,productId, firstname order by tranTime asc as rownum) 
With maxvalues as 
(Select tranDate,productId, currentStat, firstname, row_number() 
over partition by tranDate,productId,firstname order by tranTime desc as rownum) 
Select min.tranDate,min.productId,min.Previousstat, max.currentStat, min.firstname 
From minvalues as min inner join maxvalues as max 
on min. tranDate = max.tranDate 
and min.productId = max.productId 
and min.firstname = max.firstname 
and min.rownum = 1 
and max.rownum = 1 
+0

Вы, сэр/мадам, изумительны! Я бы поцеловал тебя прямо сейчас, если бы мог! Я был в этой проблеме в течение дня или около того, и это заводило меня с ума. Спасибо огромное! – GaBBaii