获取每个 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 汇总其值