Sql server 复制相同的值,直到SQL Server中出现新值
我的表中有以下数据Sql server 复制相同的值,直到SQL Server中出现新值,sql-server,Sql Server,我的表中有以下数据 Name Break AA 1 BB 1 CC DD EE 1 FF GG 1 现在我想要下面的结果 该规则类似于在更新的名称列中复制名称列的值,直到在中断列中找到1为止 如何获得上述结果?使用带窗口的子查询 IF OBJECT_ID('tempdb..#Names') IS NOT NULL DROP TABLE #Name
Name Break
AA 1
BB 1
CC
DD
EE 1
FF
GG 1
现在我想要下面的结果
该规则类似于在更新的名称列中复制名称列的值,直到在中断列中找到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
试试这个
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
结果/演示您也可以使用嵌套的选择查询,如下所示 注:我假设姓名不一定按字母顺序排列
; 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
哪一列决定顺序?它是按名字的字母顺序排列的吗?看看这类东西的滞后。不过,您需要的是一种可靠的数据排序方法。可以使用示例数据中的名称,但这作为排序列非常脆弱。使用直接延迟不会拖动超过1行的以前记录。这不是我真正想要的。但这有点接近我的预期。谢谢
; 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