【问题标题】:Select rows with same ID, collapse rows with null / non-null values选择具有相同 ID 的行,折叠具有空/非空值的行
【发布时间】:2020-01-06 14:12:02
【问题描述】:

我觉得一看到这个我就要打自己,但是这里是:

数据:

CREATE TABLE testdata (
    id int,
    email varchar(25),
    street nvarchar(50),
    town nvarchar(15),
    zip nvarchar(5)
    source nvarchar(15))


INSERT INTO testdata (
    id,
    email,
    street,
    town,
    zip,
    source
)
VALUES
    (
        1,
        'myemail@email.com',
        null,
        'happy',
        null
    ),
    (
        1,
        'myemail@gmail.com',
        null,
        'happy',
        '19400'
    );

这会产生:

-------------------------------------------------------------
|id |email              |street        |town        |zip    |
|1  |myemail@email.com  |happy place   |happy       |(null) |
|1  |myemail@gmail.com  |(null)        |happy       |19400  |

我想要达到的是

|id |email              |street        |town        |zip    |
|1  |myemail@email.com  |happy place   |happy       |19400  |

基本上,我想折叠所有行并在 ID 相同的情况下抓取任何不为空的内容。如果它们都为空,则获取空值。我尝试通过合并进行自加入,但没有奏效。我觉得好像我已经很接近了,但是有没有我可以使用的功能可以让这更容易?

注意事项:只能有两行具有相同的 ID(不确定这是否更难或更容易)。如果两行都填充了信息,我想要第一行。

【问题讨论】:

  • “第一行”对您意味着什么?考虑一下,对于 SQL Server,表是未排序的行包,除非表中有一些数据定义了顺序对您意味着什么。还有一个名为id 但允许重复值的列似乎是一个严重的设计缺陷。标识符应该是键。
  • 如果您将id 设为主键并将email 设为唯一约束,则永远不会出现重复项。
  • 这有点难以理解,但本质上具有相同 ID 的本质是另一个折叠记录的进程。因此,在上述情况下,有一次是 ID 1 和 ID 2,但系统识别出重复的值,因此删除了一个并保留了另一个。这是 50,000 英尺的景观
  • 如果用户输入了两次凭据,您可能应该及时取最后一次。如果他搬到另一个地方,那么从另一个条目中填写缺失的部分可能不是一个好主意,因为这可能会混淆不相关的地址。如果他从没有街道名称的“小村庄”搬到纽约百老汇,结果可能会变成百老汇小村庄。
  • 遗憾的是,这是由销售团队推动的。当有人懒得搜索人 X 时,他们只需输入他即可生成一个新的唯一 ID。由于所有其他信息都可以匹配,因此可以通过 CRM 中的流程将其折叠。

标签: sql sql-server tsql


【解决方案1】:

表中没有“第一”行,除非您有一列指定顺序。您的表格没有这样的列。

所以,你能做的最好的就是聚合:

select email, max(street) as street, max(town) as town, max(zip) as zip
from testdata
group by email;

【讨论】:

  • 如果 OP 想要第一行,并且第二行的城镇是 sad,这将从第二行返回城镇。
  • 不幸的是,这实际上和它一样好。积极的是,在 5000 万+ 中,每月只有大约 20k 行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 2023-01-11
  • 2012-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多