Использование SQL для получения данных предыдущих строк - PullRequest
5 голосов
/ 16 мая 2011

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

Я посмотрел с помощью курсоров, и это кажется немного сложным. Это лучший путь?

Я также пытался присвоить значение новому полю ...

newField = (выберите field1 из таблицы 1, где «предыдущая строка») предыдущая строка, где я застрял. Я не могу понять, как выбрать строку под текущей строкой.

Я использую SQL Server 2005

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 17 мая 2011
-- Test data
declare @T table (ProjectNumber int, DateChanged datetime, Value int)
insert into @T 
  select 1, '2001-01-01', 1 union all
  select 1, '2001-01-02', 1 union all
  select 1, '2001-01-03', 3 union all
  select 1, '2001-01-04', 3 union all
  select 1, '2001-01-05', 4 union all
  select 2, '2001-01-01', 1 union all
  select 2, '2001-01-02', 2

-- Get CurrentValue and PreviousValue with a Changed column
;with cte as
(
  select *,
    row_number() over(partition by ProjectNumber order by DateChanged) as rn
  from @T
)
select
  C.ProjectNumber,
  C.Value as CurrentValue,
  P.Value as PreviousValue,
  case C.Value when P.Value then 0 else 1 end as Changed
from cte as C
  inner join cte as P
    on C.ProjectNumber = P.ProjectNumber and
       C.rn = P.rn + 1

-- Count the number of changes per project  
;with cte as
(
  select *,
    row_number() over(partition by ProjectNumber order by DateChanged) as rn
  from @T
)
select
  C.ProjectNumber,
  sum(case C.Value when P.Value then 0 else 1 end) as ChangeCount
from cte as C
  inner join cte as P
    on C.ProjectNumber = P.ProjectNumber and
       C.rn = P.rn + 1
group by C.ProjectNumber
3 голосов
/ 16 мая 2011

Это действительно зависит от того, что говорит вам, что строка является «предыдущей строкой».однако самостоятельное объединение должно делать то, что вы хотите:

select *
from Table1 this
  join Table2 prev on this.incrementalID = prev.incrementalID+1
2 голосов
/ 16 мая 2011

Если у вас есть следующая таблица

CREATE TABLE MyTable (
   Id            INT NOT NULL,
   ChangeDate    DATETIME NOT NULL,
   .
   .
   .
)

Следующий запрос вернет предыдущую запись для любой записи из MyTable.

SELECT tbl.Id,
       tbl.ChangeDate,
       hist.Id,
       hist.ChangeDate
  FROM MyTable tbl 
       INNER JOIN MyTable hist
        ON hist.Id = tbl.Id 
       AND hiost.ChangeDate = (SELECT MAX(ChangeDate) 
                                 FROM MyTable sub 
                                WHERE sub.Id = tbl.Id AND sub.ChangeDate < tbl.ChangeDate)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...