【问题标题】:Redshift get rows with highest priority and timestampRedshift 获取具有最高优先级和时间戳的行
【发布时间】: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 |
+====+======+=========+============+

【问题讨论】:

    标签: sql amazon-redshift amazon-redshift-spectrum sql-rank


    【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多