获取每个 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 的最新记录的主要内容,如果未能解决你的问题,请参考以下文章

从每个组中获取最新记录

获取几个月的最新记录并使用 Oracle PL-SQL 为每个 ID 汇总其值

如何使用 rank 函数获取 hive 中的最新记录

在 sqlalchemy 中使用 distinct()/group_by() 获取基于每个“名称”列的最新记录

mysql根据某个字段分组根据更新时间获取最新的记录

如何设置子查询以获取具有最新日期和最大 ID 的单个记录?