我有一个表(客户),它有43列用户信息(名、姓、地址、城市、州、邮政、电话、电子邮件、visitDate、lastActive等)
每天晚上,我都从我们的客户那里得到当天拜访他们的客户的信息。这些访问被存储到customers表中,而不删除旧记录。旧记录被标记为lastActive = 0,新记录被标记为lastActive = 1。任何空字段存储为"Unknown"。
显然,这会导致一个非常大的表,需要一些时间来查询。因此,我计划创建一个新表,其中只包含不同的用户及其最完整的信息。
例如:如果Bob Smith在1月1日被导入,没有电话或电子邮件,然后在8月1日再次导入,带电话,但没有电子邮件,然后在9月1日再次导入,没有电话,但有电子邮件,我的客户表看起来像这样:
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
所以我的问题是,从客户表中获取不同的人并将他们插入到新表中的最佳方法是什么?其中Bob只有一个条目,但我将为每个字段提供值(例如,如果每个条目都有电话,我们将从最近的条目中提取电话),结果如下所示:
CustomerKey FirstName LastName Phone Email visitDate
1 Bob Smith 5551231234 1@2.io 2016-09-01
您可以使用 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'
值将具有最低的优先级。
您可以使用所有记录的最大值,这将导致以下结果:
select customerkey, max(firstname), max(lastname), max(phone), max(email), max(visitdate) from yourtablename
如果您有两个以上的有效条目,那么使用row_number并根据最近的值选择max