我在数据库中有一些交易。我需要按自定义顺序对交易进行排名。交易是
交易需要按照csave列的降序排列,具有相同tx编号的交易将获得相同的排名。所以我执行以下查询:
SELECT * , DENSE_RANK() over (ORDER BY csave desc, tx) AS rank
FROM noma_d.setu_test.report_result
结果:
在上述事务中,对于相同的tx,csave列的值是相同的。让我们考虑下面的交易,其中 tx = 1 , csave 值不同。
现在,如果我执行相同的上述查询,那么结果我得到了:
此处, tx = 1 的一笔交易排名= 2 , tx = 1 的另一笔交易排名= 5 即可。但我想将 tx = 1 的所有交易都提供给 rank = 2 ,因为 tx = 1 的一项交易获得了排名 2 因此 tx = 1 的其余交易也必须为 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