gpt4 book ai didi

sql - 从另一行复制值

转载 作者:行者123 更新时间:2023-12-02 22:43:38 26 4
gpt4 key购买 nike

我有一个看起来像这样的表:

  ID               AMID           DESC                  value 
-----------------------------------------------------------------
100 type A AMID type A 10
101 type B AMID type B 18
102 type C AMID type C 34
101 null null 4
102 null null 19
103 type D AMID type D 6
103 type E null 7

该表包含大约 600 万行。

现在我想要这样的结果

  ID               AMID           DESC                  value 
-------------------------------------------------------------
100 type A AMID type A 10
101 type B AMID type B 18
102 type C AMID type C 34
101 type B AMID type B 4
102 type C AMID type C 19
103 type D AMID type D 6
103 type E null 7

当两行中ID的AMID相等时显示相同的值,其中之一为空,如果AMID不同则保持原样..

在此先感谢您的帮助..

干杯,

哈里什

最佳答案

首先,让我们设置一些适当的 DDL 和示例数据:

USE tempdb;
GO

CREATE TABLE dbo.AMID
(
ID INT,
AMID VARCHAR(32),
[DESC] VARCHAR(32),
value INT
);

INSERT dbo.AMID SELECT 100, 'type A', 'AMID type A', 10
UNION ALL SELECT 101, 'type B', 'AMID type B', 18
UNION ALL SELECT 102, 'type C', 'AMID type C', 34
UNION ALL SELECT 101, null , null , 4
UNION ALL SELECT 102, null , null , 19
UNION ALL SELECT 103, 'type D', 'AMID type D', 6
UNION ALL SELECT 103, 'type E', null , 7;

不是在没有 ORDER BY 的情况下使用 TOP,我什至不知道它是什么意思,您可以只选择一行用于使用分区 + 顺序填充 NULL 行。在你有限的样本数据中,任何 ID 最多只有两行,但如果你可以有更多,这很重要(否则,就像没有 ORDER BY 的 TOP 一样,你将提取一些任意行,使你的更新低于预期)。这按 AMID 列中的值排序,但您可以更改它以使用表中的任何条件选择每个 ID 的顶行。

;WITH src AS 
(
SELECT ID, AMID, [DESC]
FROM dbo.AMID
WHERE AMID IS NULL AND [DESC] IS NULL
),
nv AS
(
SELECT ID, AMID, [DESC], rn = ROW_NUMBER() OVER
(PARTITION BY ID ORDER BY AMID) -- change this ordering accordingly
FROM dbo.AMID
WHERE AMID IS NOT NULL
)
UPDATE src
SET AMID = nv.AMID, [DESC] = COALESCE(nv.[DESC], src.[DESC])
FROM src INNER JOIN nv
ON src.ID = nv.ID
WHERE nv.rn = 1;

SELECT ID, AMID, [DESC], Value FROM dbo.AMID;

结果:

ID   AMID    DESC         value
--- ------ ----------- -----
100 type A AMID type A 10
101 type B AMID type B 18
102 type C AMID type C 34
101 type B AMID type B 4
102 type C AMID type C 19
103 type D AMID type D 6
103 type E NULL 7

不要忘记清理:

DROP TABLE dbo.AMID;
GO

顺便说一句,DESC 是一个糟糕的列名,因为它是一个 T-SQL 关键字,因此总是必须用 [双引号].

关于sql - 从另一行复制值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10383879/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com