在 Snowflake 中选择具有 MAX 时间戳的变量

Choosing variable with MAX timestamp in Snowflake

所以我有一些数据如下:

ID  status date
001  happy 01-01-2021
001    sad 01-02-2021
002  angry 01-03-2021
003    sad 01-04-2021
004  happy 01-05-2021
003  happy 01-05-2021
004  happy 01-06-2021

我想要做的就是拥有一个 table 具有唯一 ID 和最近日期的状态。

最终输出:

ID  status date
001    sad 01-02-2021
002  angry 01-03-2021
003  happy 01-05-2021
004  happy 01-06-2021

我知道如何使用 row_number PARTITION 执行此操作,但这在计算上非常费力。还有其他方法可以实现上述目标吗?

最简单的方法是告诉数据库您想要什么,让它来完成工作。一个分区然后排序并不昂贵。

SELECT a,b,c,e
FROM table
QUALIFY ROW_NUMBER() OVER(PARTITION BY a,b ORDER BY c) = 1;

为了比较当前两个解决方案的“速度”,让我们用 10M 行制作一个 table:

CREATE TABLE small_data AS
SELECT 
    SEQ8() as seq,
    mod(seq, 20) as part,
    random() as rnd
FROM TABLE(generator(ROWCOUNT => 10000000));

运行 我的代码

SELECT seq, part, rnd
FROM small_data
QUALIFY ROW_NUMBER() OVER(PARTITION BY part ORDER BY rnd) = 1;

605 ms to return.

运行Tim代码的自连接

SELECT t1.*
FROM small_data t1
WHERE NOT EXISTS (SELECT 1 FROM small_data t2
                  WHERE t2.part = t1.part AND t2.rnd > t1.rnd);

I aborted after 3m 30s

您可以尝试使用现有逻辑来替代 ROW_NUMBER:

SELECT t1.*
FROM yourTable t1
WHERE NOT EXISTS (SELECT 1 FROM yourTable t2
                  WHERE t2.ID = t1.ID AND t2.date > t1.date);