我的表格中有以下数据
Name Break
AA 1
BB 1
CC
DD
EE 1
FF
GG 1
现在我想要下面的结果。
规则就像更新名称列中名称列的副本值,直到找到 1 in break 列。
Name Break UpdatedName
AA 1 AA
BB 1 BB
CC BB
DD BB
EE 1 EE
FF EE
GG 1 GG
如何获得上述结果?
答案 0 :(得分:1)
使用"窗口"子查询。
IF OBJECT_ID('tempdb..#Names') IS NOT NULL
DROP TABLE #Names
CREATE TABLE #Names (
Name VARCHAR(2),
Breaks INT)
INSERT INTO #Names (
Name,
Breaks)
VALUES
('A', 1),
('B', 1),
('C', NULL),
('D', NULL),
('E', 1),
('F', NULL),
('G', 1)
SELECT
N.Name,
N.Breaks,
UpdatedName = (SELECT MAX(X.Name) FROM #Names AS X WHERE X.Name <= N.Name AND X.Breaks = 1)
FROM
#Names AS N
答案 1 :(得分:1)
试试这个
DECLARE @Data AS TABLE(Name VARCHAr(10), [Break] INt)
INSERT INTO @Data
SELECT 'AA',1 UNION ALL
SELECT 'BB',1 UNION ALL
SELECT 'CC',NULL UNION ALL
SELECT 'DD',NULL UNION ALL
SELECT 'EE',1 UNION ALL
SELECT 'FF',NULL UNION ALL
SELECT 'GG',1
SELECT Name,[Break],
IIF([Break]=1,Name,LAG(Name,1)OVER(ORDER BY Name)) AS UpdatedName
FROM @Data
答案 2 :(得分:1)
您也可以使用嵌套的Select查询,如下所示 的 see live demo 强>
注意:我假设名称不一定按字母顺序排列
; with cte as
(select rn=row_number() over (order by (select NULL)), * from tbl)
select
c1.Name,
c1.[Break],
updateValue=
case
when c1.[break] is not null
then C1.Name
else
(
select
TOP 1
c2.Name
from cte c2
where c2.rn<c1.rn
and c2.[break] is NOT NULL
order BY rn desc
) end
from cte c1
order by c1.rn