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。