Sql 根据最新状态/属性值检索记录 Redshift中的阿德规范结构和计划是保持创建记录,而检索时只考虑对用户的最新属性。
下表如下:Sql 根据最新状态/属性值检索记录 Redshift中的阿德规范结构和计划是保持创建记录,而检索时只考虑对用户的最新属性。,sql,postgresql,greatest-n-per-group,amazon-redshift,Sql,Postgresql,Greatest N Per Group,Amazon Redshift,下表如下: user_id state created_at 1 A 15-10-2015 02:00:00 AM 2 A 15-10-2015 02:00:01 AM 3 A 15-10-2015 02:00:02 AM 1 B 15-10-2015 02:00:03 AM 4 A 15-10-2015 02:00:04 AM 5 B
user_id state created_at
1 A 15-10-2015 02:00:00 AM
2 A 15-10-2015 02:00:01 AM
3 A 15-10-2015 02:00:02 AM
1 B 15-10-2015 02:00:03 AM
4 A 15-10-2015 02:00:04 AM
5 B 15-10-2015 02:00:05 AM
所需的结果集为:
user_id state created_at
2 A 15-10-2015 02:00:01 AM
3 A 15-10-2015 02:00:02 AM
4 A 15-10-2015 02:00:04 AM
我有检索上述结果的查询:
select user_id, first_value AS state
from (
select user_id, first_value(state) OVER (
PARTITION BY user_id
ORDER BY created_at desc
ROWS between UNBOUNDED PRECEDING and CURRENT ROW)
from customer_properties
order by created_at) t
where first_value = 'A'
这是检索的最佳方法还是可以改进查询?最佳查询取决于各种细节:查询谓词的选择性、基数、数据分布。如果
state='A'
是一个选择性条件(视图行符合条件),则此查询应大大加快:
SELECT c.user_id, c.state
FROM customer_properties c
LEFT JOIN customer_properties c1 ON c1.user_id = c.user_id
AND c1.created_at > c.created_at
WHERE c.state = 'A'
AND c1.user_id IS NULL;
提供了一个关于(state)
(甚至是(state,user\u id,created\u at)
)的索引和另一个关于(user\u id,created\u at)
的索引
有多种方法可以确保该行的更高版本不存在:
'A'
是状态下的一个公共值
,则此更通用的查询将更快:
SELECT user_id, state
FROM (
SELECT user_id, state
, row_number() OVER (PARTITION BY user_id ORDER BY created_at DESC) AS rn
FROM customer_properties
) t
WHERE t.rn = 1
AND t.state = 'A';
我上次删除了空值
,假设在处创建的定义为非空值
。此外,我认为红移没有:
这两个查询都应该使用红移的有限功能。现代博士后有更好的选择:
如果最新的行匹配,则原始文件将根据用户id返回所有行。您将不得不折叠重复项,不必要的工作…最佳查询取决于各种细节:查询谓词的选择性、基数、数据分布。如果state='A'
是一个选择性条件(视图行符合条件),则此查询应大大加快:
SELECT c.user_id, c.state
FROM customer_properties c
LEFT JOIN customer_properties c1 ON c1.user_id = c.user_id
AND c1.created_at > c.created_at
WHERE c.state = 'A'
AND c1.user_id IS NULL;
提供了一个关于(state)
(甚至是(state,user\u id,created\u at)
)的索引和另一个关于(user\u id,created\u at)
的索引
有多种方法可以确保该行的更高版本不存在:
如果'A'
是状态下的一个公共值
,则此更通用的查询将更快:
SELECT user_id, state
FROM (
SELECT user_id, state
, row_number() OVER (PARTITION BY user_id ORDER BY created_at DESC) AS rn
FROM customer_properties
) t
WHERE t.rn = 1
AND t.state = 'A';
我上次删除了空值
,假设在处创建的定义为非空值
。此外,我认为红移没有:
这两个查询都应该使用红移的有限功能。现代博士后有更好的选择:
如果最新的行匹配,则原始文件将根据用户id返回所有行。您将不得不折叠重复项,不必要的工作…created_at column正在查询中使用,并且在示例数据中丢失,问题已更新。created_at column正在查询中使用,并且在示例数据中丢失,问题已更新。