2015-07-22 3 views
1
Row  TimeStamp 
____|________________________ 
1 | 2015-01-01 12:00:01.000 
2 | 2015-01-01 12:00:02.000 
3 | 2015-01-01 12:00:03.000 
4 | 2015-01-01 12:00:04.000 
5 | 2015-01-01 12:00:05.000 
6 | 2015-01-01 12:00:06.000 
7 | 2015-01-01 12:00:07.000 
8 | 2015-01-01 12:00:08.000 
9 | 2015-01-01 12:00:09.000 

Выбор TimeStamp предыдущей строки была довольно простой задачейВыбрать предыдущую строку для каждой записи в таблице/Список

например

SELECT MAX([TimeStamp]) 
FROM [MyTable] 
WHERE [TimeStamp] < '2015-01-01 12:00:02.000' 

получает 2015-01-01 12:00:01.000 как ожидалось.

Однако у меня возникли проблемы с выбором списка TimeStamps из нескольких предыдущих строк.

Например, если бы я хотел, чтобы получить временные метки предыдущих строк для Его> = 3 & & < = 6

(i.e. 
    SELECT [TimeStamp] 
    FROM [MyTable] 
    WHERE [Row] >= 3 AND [Row] <= 6 

    => 

    TimeStamps  
    2015-01-01 12:00:03.000 
    2015-01-01 12:00:04.000 
    2015-01-01 12:00:05.000 
    2015-01-01 12:00:06.000 
) 

Как бы я идти о получении предшествующей TimeStamp для каждого из них строки результатов?

(i.e. 
    TimeStamps     
    2015-01-01 12:00:02.000 
    2015-01-01 12:00:03.000 
    2015-01-01 12:00:04.000 
    2015-01-01 12:00:05.000 
) 

Я видел довольно много решений, связанных с лаг/свинца, но мое использование SQLServer 2008 трудно изменить.

ответ

1

Вы можете попробовать это:

SELECT 
    t.TimeStamp, 
    (
    SELECT MAX(t1.TimeStamp) 
     FROM MyTable t1 
     WHERE t1.Row < t.Row 
    ) AS PrevTimeStamp 
FROM MyTable t 
WHERE t.Row >= 3 AND t.Row <= 6 

Это даст вам сторону в каждом конкретном боковые столбцы, один ток и один предыдущий.

0
select b.id, max(a.timestamp) 
from mytable a join mytable b 
on a.id < b.id 
where b.id between --desired values 
group by b.id 

Вот скрипка с данными выборки: fiddle

это будет работать для вас? Это будет join во всех предыдущих строках, а затем поднимет отметку времени max, которая всегда будет значением предыдущей строки, при условии, что столбец временной метки упорядочен по возрастанию.

0

Вы можете использовать CTE для нумерации строк и посмотреть предыдущий с left join:

; with numbered as 
     (
     select row_number() over (order by TimeStamp) as rn 
     ,  * 
     from YourTable 
     ) 
select cur.TimeStamp 
,  prev.TimeStamp 
from numbered cur 
left join 
     numbered prev 
on  prev.rn + 1 = cur.rn 
where cur.row between 3 and 6 
Смежные вопросы