如何在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中,如何快速删除大批量数据和进行大批量数据导入?