历史 sql Table 包含一些用户信息 - 新建 Table 包含 1 个条目和所有信息
Historical sql Table With Bits Of User Information - Make New Table With 1 Entry & All Information
我有一个 table(客户),它有 43 列用户信息(名字、姓氏、地址、城市、州、邮政编码、phone、电子邮件、visitDate、lastActive、等等...)
每天晚上,我都会从我们的客户那里收到当天拜访他们的客户的反馈。这些访问存储在客户 table 中,而不会删除旧记录。旧记录标记为 lastActive = 0,新记录标记为 lastActive = 1。任何空字段都存储为 "Unknown".
显然这会导致非常大的 table 需要一段时间才能查询。因此,我计划制作一个新的 table,它仅包含不同的用户及其最完整的信息。
例如:如果 Bob Smith 于 1 月 1 日导入时没有 phone 或电子邮件,然后他在 8 月 1 日再次导入时使用 phone,但没有电子邮件,然后导入9 月 1 日再次没有 phone,但有一封电子邮件,我的客户 table 看起来像这样:
CustImportID CustomerKey FirstName LastName Phone Email visitDate lastActive
1 1 Bob Smith Unknown Unknown 2016-01-01 0
2 1 Bob Smith 5551231234 Unknown 2016-08-01 0
3 1 Bob Smith Unknown 1@2.io 2016-09-01 1
所以我的问题是,从客户 table 中获取不同人员的最佳方式是什么,并将他们插入到新的 table 中,Bob 将只有一个条目,但我每个字段都有值(如果每个条目都有 phone,例如,我们将从最近的条目中提取 phone),结果是这样的:
CustomerKey FirstName LastName Phone Email visitDate
1 Bob Smith 5551231234 1@2.io 2016-09-01
您可以使用所有记录中的最大值,结果如下:
select customerkey, max(firstname), max(lastname), max(phone), max(email), max(visitdate) from yourtablename
如果您有两个更有效的条目,则根据最近的值使用 row_number 和 select 最大值
您可以使用 FIRST_VALUE
技巧来忽略 'Uknown'
值:
SELECT FirstName, LastName,
FIRST_VALUE(Phone) OVER (ORDER BY CASE
WHEN Phone='Unknown' THEN 1
ELSE 0
END,
visitDate DESC) AS Phone,
FIRST_VALUE(Email) OVER (ORDER BY CASE
WHEN Email='Unknown' THEN 1
ELSE 0
END,
visitDate DESC) AS Email
FROM mytable
FIRST_VALUE
可从 SQL Server 2012 获得。它选择由 OVER
子句的 ORDER BY
指定的最新字段值。由于 ORDER BY
子句中的 CASE
,'Unknown'
值的优先级最低。
我有一个 table(客户),它有 43 列用户信息(名字、姓氏、地址、城市、州、邮政编码、phone、电子邮件、visitDate、lastActive、等等...)
每天晚上,我都会从我们的客户那里收到当天拜访他们的客户的反馈。这些访问存储在客户 table 中,而不会删除旧记录。旧记录标记为 lastActive = 0,新记录标记为 lastActive = 1。任何空字段都存储为 "Unknown".
显然这会导致非常大的 table 需要一段时间才能查询。因此,我计划制作一个新的 table,它仅包含不同的用户及其最完整的信息。
例如:如果 Bob Smith 于 1 月 1 日导入时没有 phone 或电子邮件,然后他在 8 月 1 日再次导入时使用 phone,但没有电子邮件,然后导入9 月 1 日再次没有 phone,但有一封电子邮件,我的客户 table 看起来像这样:
CustImportID CustomerKey FirstName LastName Phone Email visitDate lastActive
1 1 Bob Smith Unknown Unknown 2016-01-01 0
2 1 Bob Smith 5551231234 Unknown 2016-08-01 0
3 1 Bob Smith Unknown 1@2.io 2016-09-01 1
所以我的问题是,从客户 table 中获取不同人员的最佳方式是什么,并将他们插入到新的 table 中,Bob 将只有一个条目,但我每个字段都有值(如果每个条目都有 phone,例如,我们将从最近的条目中提取 phone),结果是这样的:
CustomerKey FirstName LastName Phone Email visitDate
1 Bob Smith 5551231234 1@2.io 2016-09-01
您可以使用所有记录中的最大值,结果如下:
select customerkey, max(firstname), max(lastname), max(phone), max(email), max(visitdate) from yourtablename
如果您有两个更有效的条目,则根据最近的值使用 row_number 和 select 最大值
您可以使用 FIRST_VALUE
技巧来忽略 'Uknown'
值:
SELECT FirstName, LastName,
FIRST_VALUE(Phone) OVER (ORDER BY CASE
WHEN Phone='Unknown' THEN 1
ELSE 0
END,
visitDate DESC) AS Phone,
FIRST_VALUE(Email) OVER (ORDER BY CASE
WHEN Email='Unknown' THEN 1
ELSE 0
END,
visitDate DESC) AS Email
FROM mytable
FIRST_VALUE
可从 SQL Server 2012 获得。它选择由 OVER
子句的 ORDER BY
指定的最新字段值。由于 ORDER BY
子句中的 CASE
,'Unknown'
值的优先级最低。