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正在查询中使用,并且在示例数据中丢失,问题已更新。