2013-04-15 4 views
1

У меня возникли проблемы с получением этой работы. У меня есть таблица с этими данными.Сравните две даты из столбцов SQL

|  DateStarted  |  Field9  |  Field2  |  ID  | Field6 | 
---------------------------------------------------------------------------------------- 
| 2013-04-15 09:23:00 |  TEST1  |  TEST2  |  1  |  2000 | 
| 2013-04-08 09:23:00 |  TEST1  |  TEST2  |  2  |  180 | 
| 2013-04-15 09:23:00 |  TEST2  |  TEST3  |  3  |  1000 | 
| 2013-04-04 09:23:00 |  TEST2  |  TEST3  |  7  |  80 | 
| 2013-04-03 09:23:00 |  TEST2  |  TEST4  |  5  |  70 | 

Что моя конечная цель в том, чтобы иметь две последние даты значения для Field9 быть возвращен, так что я мог бы вычитать значение Field6 для каждого уникального экземпляра Field9. Ниже приведен пример возврата.

|  DateStarted  |  Field1  |  Field2  |  ID  | SUB  | 
---------------------------------------------------------------------------------------- 
| 2013-04-15 09:23:00 |  TEST1  |  TEST2  |  1  |  1820 | 
| 2013-04-15 09:23:00 |  TEST2  |  TEST3  |  3  |  920 | 

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

ответ

2

Вы можете получить последнюю строку для каждого уникального значения Field1 с помощью секционированных оконных функций.

;WITH x AS 
(
    SELECT DateStarted, Field9, Field2, ID, Field6, 
    rn = ROW_NUMBER() OVER (PARTITION BY Field9 ORDER BY DateStarted DESC) 
    FROM dbo.your_table_name 
), 
y AS 
(
    SELECT x.*, [SUB] = x.Field6 - COALESCE(y.Field6, 0) 
    FROM x LEFT OUTER JOIN x AS y 
    ON x.Field9 = y.Field9 
    AND x.rn = 1 AND y.rn = 2 
) 
SELECT DateStarted, Field1 = Field9, Field2, ID, [SUB] 
    FROM y 
    WHERE rn = 1 
    ORDER BY Field1; 

SQL fiddle demo

+0

hi Aaron, я видел, что многие разработчики sql используют синтаксис, подобный вашему: 'rn = ROW_NUMBER() OVER (PARTITION by Field1 ORDER BY DateStarted DESC)', это новый или старый синтаксис, чем 'ROW_NUMBER() OVER (PARTITION by Field1 ORDER BY DateStarted DESC) rn', потому что я всегда использую второй.? –

+0

@JW Есть много способов выражения псевдонимов, и это в основном просто стиль. [Вы можете прочитать, почему мне нравится синтаксис «alias = expression» и не нравится «псевдоним выражения» и предпочтет «выражение AS alias» вместо этого] (http://sqlblog.com/blogs/aaron_bertrand/archive/2012/01/23/ плохая-привычка-к-игры-с использованием-в-вместо-о-в-колонного aliases.aspx). –

+0

@AB Я изменил то, что вы вы предоставлены; С х AS ( ВЫБОР DateStarted, Field9, Field2, FILEID, field3, гп = ROW_NUMBER() OVER (PARTITION BY Field1 ORDER BY DateStarted DESC) из файлов где Status = 1 и ProjectID = 21 и Field10 = 'EMAIL' ) SELECT DateStarted, Field9, Field2, fileid, Field3 FROM x WHERE rn = 1 ORDER BY Field9; но он просто возвращает наибольшую дату для одного значения поля 9, где он должен давать каждую из величайших дат для каждого из значений в Field9 – thedemon

0

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

select MAX(case when seqnum = 1 then DateStarted end), Field1, 
     max(case when seqnum = 1 then Field2 end) as Field2 
     MAX(case when seqnum = 1 then id end) as Id, 
     MAX(case when seqnum = 1 then field3 end) - MAX(case when seqnum = 2 then field 3 end) as sub 
from (SELECT DateStarted, Field1, Field2, ID, Field3, 
      ROW_NUMBER() OVER (PARTITION BY Field1 ORDER BY DateStarted DESC) as seqnum 
     FROM t 
    ) t 
group by Field1 

Это используется условная агрегацию, чтобы получить разницу.

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