如何在redshift中按自定义顺序对交易进行排名?

时间:2017-07-07 07:47:35

标签: sql amazon-redshift

我在数据库中有一些交易。我需要按自定义顺序对交易进行排名。交易是

enter image description here

交易需要按照csave列的降序排列,具有相同tx编号的交易将获得相同的排名。所以我执行以下查询:

SELECT * , DENSE_RANK() over (ORDER BY csave desc, tx) AS rank
FROM noma_d.setu_test.report_result

结果:

enter image description here

在上述事务中,对于相同的tx,csave列的值是相同的。让我们考虑下面的交易,其中 tx = 1 csave 值不同。

enter image description here

现在,如果我执行相同的上述查询,那么结果我得到了:

enter image description here

此处, tx = 1 的一笔交易排名= 2 tx = 1 的另一笔交易排名= 5 即可。但我想将 tx = 1 的所有交易都提供给 rank = 2 ,因为 tx = 1 的一项交易获得了排名 2 因此 tx = 1 的其余交易也必须为 2

预期输出如下:

enter image description here

如何通过修改上述查询来实现这一目标?

2 个答案:

答案 0 :(得分:1)

你需要在排名前按tx分组,所以我把它放在子查询中:

select t1.*, t2.rank
from noma_d.setu_test.report_result
inner join 
(
    select a2.*, row_number() over (order by csave desc) as rank
    from 
    (
        select tx, max(csave) as csave
        from noma_d.setu_test.report_result
        group by tx
    ) a2
) t2
    on t1.tx = t2.tx

答案 1 :(得分:0)

正如JohnHC所回答,需要在排名前按 tx 进行分组,并使用 rank()而不是 row_number()。最后的查询是:

select t1.*, t2.rank
from noma_d.setu_test.report_result as t1
inner join 
(
    select a2.*, rank() over (order by csave desc, tx) as rank
    from 
    (
        select tx, max(csave) as csave
        from noma_d.setu_test.report_result
        group by tx
    ) a2
) t2
    on t1.tx = t2.tx