简体   繁体   English

获取每个 id 的最新记录

[英]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:用户表:

Users 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM