获取每个 id 的最新记录

Posted

技术标签:

【中文标题】获取每个 id 的最新记录【英文标题】:Get most recent record for each id 【发布时间】:2019-03-21 10:05:04 【问题描述】:

我正在尝试获取数据库中所有用户的列表。然后我有另一个表,其中只有成员用户。

问题在于,今天成为会员的一些人,在以前可能是客户、会员,或者他们都不是。所以我们可以有重复。

我想做的是根据数据库中存在的日期列仅选择最近的记录。

这是 2 个表格的输出:

用户表:

Users table

成员表: Members table

想要在保留用户表中的所有不同记录和成员表中具有最新 cd.value 的最匹配记录的情况下左连接表。

    WITH users AS(

SELECT
fullVisitorId AS Clientid

FROM `records`
WHERE
_TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d',DATE_SUB(CURRENT_DATE(), INTERVAL 10 DAY))
AND
FORMAT_DATE('%Y%m%d',DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))
AND
totals.visits = 1


), members As(

SELECT
MAX(date) AS date,
fullVisitorId AS Clientid,
cd.value AS CD_value,
cd.index AS CD_index

FROM `records`,
UNNEST(customDimensions) AS cd
WHERE
_TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d',DATE_SUB(CURRENT_DATE(), INTERVAL 10 DAY))
AND
FORMAT_DATE('%Y%m%d',DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))
AND
totals.visits = 1
AND
cd.index = 6
group by
Clientid,
CD_value,
CD_index


)

SELECT
users.ClientId AS clientId,
members.CD_value

from users


LEFT JOIN members ON users.ClientId = members.Clientid


group by
members.CD_value,
clientId


order by
clientId ASC

【问题讨论】:

现在添加图片和更多描述。 不要在问题中使用图片。其他开发人员无法复制内容并使您的问题难以解决。 【参考方案1】:

尝试使用 row_number()

WITH users AS(

SELECT
fullVisitorId AS Clientid

FROM `records`
WHERE
_TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d',DATE_SUB(CURRENT_DATE(), INTERVAL 10 DAY))
AND
FORMAT_DATE('%Y%m%d',DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))
AND
totals.visits = 1


), members As(

SELECT
date AS date,
fullVisitorId AS Clientid,
cd.value AS CD_value,
cd.index AS CD_index,
row_number() over(partition by Clientid,
CD_value,
CD_index order by date desc) rn

FROM `records`,
UNNEST(customDimensions) AS cd
WHERE
_TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d',DATE_SUB(CURRENT_DATE(), INTERVAL 10 DAY))
AND
FORMAT_DATE('%Y%m%d',DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))
AND
totals.visits = 1
AND
cd.index = 6 


), m2 as ( select * from members where rn=1)

SELECT distinct
users.ClientId AS clientId,
m2.CD_value

from users  

LEFT JOIN m2 ON users.ClientId = m2.Clientid  


order by
clientId ASC

【讨论】:

感谢您的回复。我现在的行太少了。看起来我只得到那些有 cd.value 的。我需要的是获取所有 clientIds,对于那些有 cd.value 的 clientIds 将拥有它,而那些没有 NULL 的 clientIds。 @user3564474 我认为您的用户表有重复数据 是的。两个表都有重复数据。我需要从它们中取出不同的值,并从成员表中为匹配的 clientIds 添加最新值,在不匹配的那些上添加 NULL。 @user3564474 只需在选择中添加不同我已在答案中对其进行编辑 也这样做了。仍然重复。

以上是关于获取每个 id 的最新记录的主要内容,如果未能解决你的问题,请参考以下文章