我需要使用以下逻辑更新当前行:
- 如果当前行为空,则将其设置为前一行
- 如果当前行不为空,则不做任何操作
第一行不为空,但随机出现 NULL
这些 NULL 需要使用前面提到的逻辑进行更新
例如:
1. 1
2. null
3. null
4. 2
5. null
6. null
需要更新为
1. 1
2. 1
3. 1
4. 2
5. 2
6. 2
如何在SQL中实现?
谢谢 r
我需要使用以下逻辑更新当前行:
第一行不为空,但随机出现 NULL
这些 NULL 需要使用前面提到的逻辑进行更新
例如:
1. 1
2. null
3. null
4. 2
5. null
6. null
需要更新为
1. 1
2. 1
3. 1
4. 2
5. 2
6. 2
如何在SQL中实现?
谢谢 r
Null
值,您需要定义表中最小的非空值,因此我认为Outer Apply
将解决您的问题。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
,它将不会给您结果,因为您没有定义此情况的逻辑。LAST_VALUE(col, true) over (PARTITION BY id ORDER BY date)
Oracle 10g也有一个函数可以实现这个功能,如下面的帖子所述:
你熟悉窗口函数吗?
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
尝试下面的脚本。(适用于sql 2008 +)
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
请查看关于“OVER子句”的链接https://learn.microsoft.com/en-us/sql/t-sql/queries/select-over-clause-transact-sql