我想从前一行获取数据。我使用了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中的值保存上一行分组的数据。 请告诉我如何实现这一目标。
答案 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)
谢谢大家的回复。通过使用带分区的滞后函数,我得到了预期的结果。我之前错过了使用分区,因为我得到了错误的结果。