Redshift 获取具有最高优先级和时间戳的行

Posted

技术标签:

【中文标题】Redshift 获取具有最高优先级和时间戳的行【英文标题】:Redshift get rows with highest priority and timestamp 【发布时间】:2020-02-15 17:30:28 【问题描述】:

我有一个红移表,记录如下


+====+======+=========+============+
| Id | Book | Action  | Timestamp  |
+====+======+=========+============+
| 1  | ABC  | ADDED   | 1111111111 |
+----+------+---------+------------+
| 1  | ABC  | REMOVED | 2222222222 |
+----+------+---------+------------+
| 1  | ABC  | CHECKED | 3333333333 |
+----+------+---------+------------+
| 2  | XYZ  | ADDED   | 4444444444 |
+----+------+---------+------------+
| 2  | XYZ  | CHECKED | 5555555555 |
+----+------+---------+------------+
| 5  | DEF  | CHECKED | 6666666666 |
+----+------+---------+------------+
| 5  | DEF  | CHECKED | 7777777777 |
+====+======+=========+============+

我想要的是为每本书获取一条记录。如果出现重复,则按 CHECKED 的最低级别的 Action 进行优先级排序,其余所有操作将具有相同的优先级,然后选择最近的记录。

预期输出


+====+======+=========+============+
| Id | Book | Action  | Timestamp  |
+====+======+=========+============+
| 1  | ABC  | REMOVED | 2222222222 |
+----+------+---------+------------+
| 2  | XYZ  | ADDED   | 4444444444 |
+----+------+---------+------------+
| 5  | DEF  | CHECKED | 7777777777 |
+====+======+=========+============+

【问题讨论】:

【参考方案1】:

一个简单的方法使用row_number()

select t.*
from (select t.*,
             row_number() over (partition by id
                                order by (case action when 'Checked' then 1 else 2 end) desc,
                                         timestamp desc
                               ) as seqnum
      from t
     ) t
where seqnum = 1;

【讨论】:

以上是关于Redshift 获取具有最高优先级和时间戳的行的主要内容,如果未能解决你的问题,请参考以下文章

CouchDB 查询以获取具有 MAX 时间戳的文档

Redshift Auto WLM 配置、队列数和查询槽?

通过 linq 对实体查询进行分组,以通过加入表来获取具有最新时间戳的一条记录

C#时间戳的简单实现

如何获取具有完整时间时间戳的 java.sql.Date 对象

如何选择每个项目具有最大时间戳的行集?