2015-02-11 4 views
1

Я не уверен, где пошло не так, но, похоже, функция LAST_VALUE не возвращает желаемый результат. То, что я пытаюсь сделать это следующим образомФункция LAST_VALUE в SQL Server 2012

Create table #temp(
    a varchar(10), 
    b varchar(10), 
    c datetime 
    ) 

    insert into #temp 
    Values('aa','bbb','2014-10-15 16:39:41.000'), 
    ('aa','bbb','2014-10-16 06:00:04.000') 

    select a,b,c, 
    FIRST_VALUE(c) over (partition by a, b order by c asc) as first_date, 
    LAST_VALUE(c) over (partition by a, b order by c asc) as last_date, 
    row_number() over (partition by a, b order by c asc) as rn 
    from #temp 

В результате я получил это следующим образом, который имеет различное последнее значение.

a | b | c | first_date | last_date | rn

aa | bbb | 2014-10-15 16: 39: 41.000 | 2014-10-15 16: 39: 41.000 | 2014-10-15 16: 39: 41.000 | 1

aa | bbb | 2014-10-16 06: 00: 04.000 | 2014-10-15 16: 39: 41.000 | 2014-10-16 06: 00: 04.000 | 2

+3

возможно дубликат [SQL: Last \ _value() возвращает неправильный результат (но сначала \ _value() работает отлично)] (http://stackoverflow.com/questions/15388892/sql-last-value- Возвращать-неправильно-результат-но-первокурсников оценочными работы-штраф) –

ответ

0

Вам необходимо указать SQL Server, какие строки включить в это окно, по умолчанию для этих функций это будет «ДИАПАЗОН МЕЖДУ НЕОГРАНИЧЕННЫМ ПРЕДПОЛАГАЕМОЙ И ТЕКУЩЕЙ РУКОЙ» или в сокращенном виде «ROWS UNBOUNDED PRECEDING», что означает все строк от начала окна до текущей строки. Поэтому, зная это, следующее приведет к тому, что вы ожидали.

select a,b,c, 
    FIRST_VALUE(c) over (partition by a, b order by c asc 
    ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as first_date, 
    LAST_VALUE(c) over (partition by a, b order by c asc 
    ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as last_date, 
    row_number() over (partition by a, b order by c asc) as rn 
from #temp 

PS: это дает тот же результат, но является более читаемым и, вероятно, быстрее.

select a,b,c, 
    min(c) over (partition by a, b) as first_date, 
    max(c) over (partition by a, b) as last_date, 
    row_number() over (partition by a, b order by c asc) as rn 
from #temp