如何在sql server中获取以前的行数据

时间:2018-05-23 13:22:03

标签: sql sql-server tsql

我想从前一行获取数据。我使用了LAG功能但没有得到预期的结果。

表: -

col1  col2  col3
ABCD    1   Y
ABCD    2   N
ABCD    3   N
EFGH    4   N
EFGH    5   Y
EFGH    6   N
XXXX    7   Y

预期结果

col1 col2 col3  col4
ABCD    1   A   NULL
ABCD    2   B   A
ABCD    3   C   B
EFGH    4   A   NULL
EFGH    5   B   A
EFGH    6   E   B
XXXX    7   F   NULL

Col4应该按照Col1中的值保存上一行分组的数据。 请告诉我如何实现这一目标。

4 个答案:

答案 0 :(得分:3)

使用lag()功能

select *, lag(col3) over (partition by col1 order by col2) as col4
from table t;

但是,如果subquery没有SQL

,您也可以使用LAG()
select *,   
        (select top 1 col3
         from table
         where col1 = t.col1 and col2 < t.col2
         order by col2 desc
        ) as col4
from table t;

答案 1 :(得分:1)

假设SQL Server 2012或更新......

SELECT
  *,
  LAG(col3) OVER (PARTITION BY col1 ORDER BY col2) AS col4
FROM
  yourTable

如果您使用的是SQL Server 2008或更早版本......

SELECT
  *,
  (
     SELECT TOP(1) previous.col3
       FROM yourTable   AS previous
      WHERE previous.col1 = yourTable.col1
        AND previous.col2 < yourTable.col2
   ORDER BY previous.col2 DESC
  )
    AS col4
FROM
  yourTable

答案 2 :(得分:0)

如果你是2008年或更早,请试试这个:

    select t1.col1, t1.col2, t1.col3, t2.col3 as col4
    from table1 t1
    left join table1 t2 on t1.col1 = t2.col1 and t1.col2 - 1 = t2.col2
但是,lag()函数是蜜蜂的膝盖。如果可以,请使用它。

答案 3 :(得分:-1)

谢谢大家的回复。通过使用带分区的滞后函数,我得到了预期的结果。我之前错过了使用分区,因为我得到了错误的结果。