[英]Get most recent record for each id
I am trying to get a list of all users in a database.我正在尝试获取数据库中所有用户的列表。 Then I have another table where I only have the users who are members.
然后我有另一个表,其中只有成员用户。
The issue is that some of those who are members today, could have been customers, members or none of them earlier.问题是,今天成为会员的一些人可能是客户、会员,或者他们都不是。 So we could have duplicates.
所以我们可以有重复。
What I want to do is to pick only the most recent record based on date column which is present in the database.我想要做的是根据数据库中存在的日期列仅选择最近的记录。
Here are the 2 tables output:这是2个表的输出:
User table:用户表:
Members table: Members table成员表:成员表
Want to left join the tables with keeping all the distinct records from users table and most matching records from members table with the most recent cd.value.想要左连接表,保留用户表中的所有不同记录和成员表中最匹配的记录,并具有最新的 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
try by using row_number()尝试使用 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.