在 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);
所以我有一些数据如下:
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);