SQL:获取每个用户每天的最新记录
我有一张看起来像的桌子SQL:获取每个用户每天的最新记录,sql,greatest-n-per-group,snowflake-cloud-data-platform,Sql,Greatest N Per Group,Snowflake Cloud Data Platform,我有一张看起来像的桌子 user_id behavior time A B1 2020-05-30 09:07:21 A B1 2020-05-31 12:38:21 A B2 2020-05-31 14:39:23 B B1 2020-05-31 12:32:09 我想获得每个用户每天的最新记录,因此上表将成为 user_id behavior time A B1 2020-05-30 09:07:21 A B2 2020-05-31 14:39:23 B B
user_id behavior time
A B1 2020-05-30 09:07:21
A B1 2020-05-31 12:38:21
A B2 2020-05-31 14:39:23
B B1 2020-05-31 12:32:09
我想获得每个用户每天的最新记录,因此上表将成为
user_id behavior time
A B1 2020-05-30 09:07:21
A B2 2020-05-31 14:39:23
B B1 2020-05-31 12:32:09
我在stackoverflow中查看了一些其他问题,但没有找到我要查找的确切内容
谢谢您的帮助。您可以尝试使用
行号()
,您必须按用户id
、行为和日期进行分区
select
user_id,
behavior,
time
from
(
select
*,
row_number() over (partition by user_id, behavior, to_date(time) order by time desc) as rnk
from yourTable
) val
where rnk = 1
输出:
| user_id | behavior | time |
| ------- | -------- | ------------------------ |
| A | B1 | 2020-05-30 09:07:21 |
| A | B2 | 2020-05-31 14:39:23 |
| B | B1 | 2020-05-31 12:32:09 |
您可以尝试使用行编号()
,您必须按用户id
、行为和日期进行分区
select
user_id,
behavior,
time
from
(
select
*,
row_number() over (partition by user_id, behavior, to_date(time) order by time desc) as rnk
from yourTable
) val
where rnk = 1
输出:
| user_id | behavior | time |
| ------- | -------- | ------------------------ |
| A | B1 | 2020-05-30 09:07:21 |
| A | B2 | 2020-05-31 14:39:23 |
| B | B1 | 2020-05-31 12:32:09 |
请使用下面的查询,您可以使用简单的min()函数
select user_id, behaviour, min(time) group by user_id, behaviour;
请使用下面的查询,您可以使用简单的min()函数
select user_id, behaviour, min(time) group by user_id, behaviour;
您的问题不清楚,但您可以使用限定
。如果您想要每个用户id
/行为的最后一次,则:
select t.*
from t
qualify row_number() over (partition by user_id, behavior order by time desc) = 1;
如果希望每个用户最近一天的最后一行,则:
select t.*
from t
qualify dense_rank() over (partition by user_id order by date(time) desc) = 1;
qualify
过滤是否像where
和have
。但是,它允许使用窗口功能。您的问题不清楚,但您可以使用限定
。如果您想要每个用户id
/行为的最后一次,则:
select t.*
from t
qualify row_number() over (partition by user_id, behavior order by time desc) = 1;
如果希望每个用户最近一天的最后一行,则:
select t.*
from t
qualify dense_rank() over (partition by user_id order by date(time) desc) = 1;
qualify
过滤是否像where
和have
。但是,它允许使用窗口函数。您使用的是哪种dbms?我使用的是snowflake,所以他们说他们使用的是ANSI SQL。您使用的是哪种dbms?我使用的是snowflake,所以他们说他们使用的是ANSI SQL。