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

Posted

技术标签:

【中文标题】如何在sql server中获取前一行数据【英文标题】:How to get previous row data in sql server 【发布时间】:2018-05-23 13:22:02 【问题描述】:

我想从上一行获取数据。我使用了 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 中的值分组。 请让我知道如何实现。

【问题讨论】:

查找lag窗口函数的文档。 您当前的查询是什么样的? 对我来说毫无意义。 col3 是如何变化的? @paparazzo。对不起。我复制了错误的数据并粘贴在这里。 Col3 与预期结果相同。只有 col4 改变。现在我从这里得到了解决方案。 @L0uis 在当前查询中,我没有使用 col1 分区。我只使用了 order by。 【参考方案1】:

使用lag()函数

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

但是,如果您的SQL 没有LAG(),您也可以使用subquery

select *,   
        (select top 1 col3
         from table
         where col1 = t.col1 and col2 < t.col2
         order by col2 desc
        ) as col4
from table t;

【讨论】:

谢谢。我使用了这个 lag() 并得到了结果【参考方案2】:

假设 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

【讨论】:

谢谢。我使用了这个 lag() 并得到了结果【参考方案3】:

如果您是 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() 函数是蜜蜂的膝盖。如果可以,请使用它。

【讨论】:

使用col2 - 1 是一个弱假设。可能存在乱序、不连续等的行。 是的,当我必须这样做时,我使用 rank() 和 cte。但是,在这种情况下,col2 看起来像主键。 @James:使用 Rank() 可以获得重复和空白,请改用 row_number()。 嗯嗯。这取决于。如果 col1 是外键,则需要重复和间隙。 谢谢。我使用了这个 lag() 并得到了结果。服务器是新版本【参考方案4】:

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

【讨论】:

以上是关于如何在sql server中获取前一行数据的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server中如何定位Row Lock锁定哪一行数据

SQL Server中如何定位Row Lock锁定哪一行数据

在SQL Server中,如何快速删除大批量数据和进行大批量数据导入?

如何从SQL Server中的重复行中获取最后一行?

sql server中获取date类的年月日(如何取中间的月分)

求助各位大神,sql server两表间一对多的关系,如何数据整合到一行数据中,问题举例在问题补充中。谢谢..