Sql 如何扫描表中的每一行,并基于上一行更新当前行?
我需要使用以下逻辑更新当前行: 如果当前行为空,则将其设置为上一行 如果当前行不为空,则不执行任何操作 第一行不为null,则null随机出现 这些空值需要使用前面提到的逻辑进行更新 e、 g 需要更新为Sql 如何扫描表中的每一行,并基于上一行更新当前行?,sql,sql-server,Sql,Sql Server,我需要使用以下逻辑更新当前行: 如果当前行为空,则将其设置为上一行 如果当前行不为空,则不执行任何操作 第一行不为null,则null随机出现 这些空值需要使用前面提到的逻辑进行更新 e、 g 需要更新为 1. 1 2. 1 3. 1 4. 2 5. 2 6. 2 如何在SQL中实现这一点 谢谢 r如果一行中有两个空值,您需要定义表中最小的非空值,因此我认为外部应用将解决您的问题: CREATE TABLE #TB(ID Int Identity(1, 1), Value Int)
1. 1
2. 1
3. 1
4. 2
5. 2
6. 2
如何在SQL中实现这一点
谢谢
r如果一行中有两个空值,您需要定义表中最小的非空值,因此我认为外部应用将解决您的问题:
CREATE TABLE #TB(ID Int Identity(1, 1), Value Int)
INSERT INTO #TB([Value]) VALUES(1),(Null),(Null),(2),(Null),(Null)
UPDATE G SET G.Value = GG.Value
FROM
#TB AS G
OUTER APPLY
(SELECT
TOP 1 *
FROM
#TB AS GG
WHERE
GG.Value IS NOT NULL
AND
GG.ID < G.ID
ORDER BY
GG.ID DESC
) AS GG
WHERE
G.Value IS NULL
SELECT * FROM #TB AS T
但请注意,如果第一个值为Null,则不会给出结果,因为您尚未定义此场景的逻辑。这可能会有帮助:
SELECT
t1.col1,
t1.col2 AS previous,
(SELECT
t2.col2
FROM table_1 t2
WHERE t2.col1 = (SELECT
MAX(t3.col1)
FROM table_1 t3
WHERE t3.col1 <= t1.col1
AND col2 IS NOT NULL))
AS new
FROM table_1 t1;
结果
您在哪里使用此SQL代码?例如,如果您使用的是配置单元SQL,则有一个函数允许您直接获取最后一个非空值:
LAST_VALUE(col, true) over (PARTITION BY id ORDER BY date)
Oracle 10g也有这样一个功能,如本线程中所述:
你熟悉窗口的功能吗 试试下面的脚本。sql 2008+
while (select count(*) FROM Table_1 where c1_derived = '') > 0
begin
update top(1) Table_1
set c1_derived = (select c1_derived from Table_1 t2 where (t2.id = [Table_1].id-1))
where c1_derived = ''
end
CREATE TABLE #table(id Int Identity(1, 1), value Int)
INSERT INTO #table([Value]) VALUES(1),(Null),(Null),(2),(Null),(Null)
;WITH cte AS
(
SELECT ID,Value,ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS row
FROM #table
)
SELECT a.ID,max(b.Value)
FROM cte a
INNER JOIN cte b ON a.row >=b.row
GROUP BY a.ID
drop table #table
Edit2这也是另一个使用无界前缀的脚本
检查这个关于OVER子句的链接
请添加您尝试过的内容。您可以使用sql server的滞后功能。您使用的是哪个版本的SQL server?您还可以使用递归SQL语句来解决它,例如,如果rowi=null,那么rowi=rowi-1,从Row1开始…随机是什么意思?你能举出一个例子来说明你在说什么,而这个逻辑并不能解决这个问题吗?
CREATE TABLE #table(id Int Identity(1, 1), value Int)
INSERT INTO #table([Value]) VALUES(1),(Null),(Null),(2),(Null),(Null)
;WITH cte AS
(
SELECT ID,Value,ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS row
FROM #table
)
SELECT a.ID,max(b.Value)
FROM cte a
INNER JOIN cte b ON a.row >=b.row
GROUP BY a.ID
drop table #table
CREATE TABLE #table(id Int Identity(1, 1), value Int)
INSERT INTO #table([Value]) VALUES(1),(Null),(Null),(2),(Null),(Null)
select * ,max(t.value) over(order by Id Rows UNBOUNDED PRECEDING) maxValue
from #table t
drop table #table