【发布时间】:2020-12-25 05:29:25
【问题描述】:
我有一个巨大的表格,其中包含所有客户的详细信息,例如他们的电话号码和电子邮件地址。该表可以为每个客户包含多行,表明他们在某些时候更改了他们的电话号码、电子邮件地址或其他个人资料信息。每行都有一个 day 列,表示配置文件更改发生的日期(即当天的配置文件状态)。
我想提取每个客户曾经在其个人资料中拥有的每个电话号码和电子邮件地址,并添加一个布尔标志(称为“实时”),指示当前与他们的个人资料相关联的电话号码和电子邮件地址(即我们在表中为该客户提供的最新记录)。
这是我当前的查询:
SELECT DISTINCT
customer_id,
phone_number,
email AS email_address,
CASE
WHEN day = (
SELECT
MAX(temp.day)
FROM
customer AS temp
WHERE
customer.customer_id = temp.customer_id
)
THEN true
ELSE false
END AS live
FROM
customer
考虑到数百万不同的客户有数十亿行,我认为这是非常低效的。我怎样才能改进这个查询来实现我想要的(可能是一个窗口函数?),或者完全不同的方式可以更好地实现我想要的?
【问题讨论】:
-
请澄清:如果客户有第一个电话号码
A,然后将其更改为B,最后又将其恢复为A(电子邮件保持不变),您是否希望看到三行这个客户还是只有两个? -
@MarmiteBomber 是的,会有 3 行
-
好的@KOB,如果你想保留所有行,你应该从查询中删除
DISTINCT...
标签: sql optimization aggregate window-functions presto