【发布时间】:2017-09-24 18:11:54
【问题描述】:
我有一张客户姓名和履历信息表。但是,每个客户的表可以有超过 1 行,但所有客户仍按相同的 ID 分组。例如......下面的客户 12345 总共有 3 行。有些行会有名字,有些则没有。同样适用于姓氏、生日等。例如,以下是我们在单个表中拥有的客户 12345 的所有信息:
customerid | priority | firstname | lastname | birthdate | state |
12345 | 1 | null | Doe | 11051983 | null |
12345 | 2 | John | Does | null | TX |
12345 | 3 | null | null | null | Texas |
我需要将客户 12345 的行向上滚动到 1 行,并且它必须包含尽可能多的传记信息。我如何让 SQL 遍历并找到第一个非缺失值(名字、姓氏、生日等)并将这些值包含在客户 12345 的最后一行中?所以最终的结果应该是这样的:
customerid | firstname | lastname | birthdate | state |
12345 | John | Doe | 11051983 | TX |
由于客户信息包含多行,我不相信我可以使用 Coalesce 功能。还有其他想法吗?
这必须在 SQL 中完成。
提前致谢!
【问题讨论】:
-
“第一个非缺失值” - 关于什么顺序?如果生日有 2 行,你在乎用的是哪一个吗?
-
我在上面添加了一个示例来展示如何处理这个问题。每条记录都有一个优先级。最高优先级的第一个非空值将显示在表格中。
-
@GeorgeRodman,为什么 max 对此不起作用?
-
因为我不一定想要生日的最高值,或者姓氏的最长字符串。我想要最高优先级记录中的第一个非空值。想象一下,上面的第三条记录的生日记录是 11051984。虽然该记录可能更大,但它并不是来自最高优先级的来源……这就是我想要的。因此,当我想要第一条记录的值时,MAX 会从第三条记录中提取生日,因为它的优先级更高。
-
@GeorgeRodman 我将答案从 MAX 修改为 SUBQUERIES,它可以满足您现在的需要。
标签: sql sql-server database