Sql 如何在红移中按自定义顺序排列事务?
我在数据库中有一些事务。我需要按自定义顺序对交易进行排序。交易是 事务需要按csave列的降序排列,具有相同tx编号的事务将获得相同的排名。因此,我执行以下查询:Sql 如何在红移中按自定义顺序排列事务?,sql,amazon-redshift,Sql,Amazon Redshift,我在数据库中有一些事务。我需要按自定义顺序对交易进行排序。交易是 事务需要按csave列的降序排列,具有相同tx编号的事务将获得相同的排名。因此,我执行以下查询: SELECT * , DENSE_RANK() over (ORDER BY csave desc, tx) AS rank FROM noma_d.setu_test.report_result 结果是: 在上述事务中,对于相同的发送,csave列的值相同。让我们考虑下面的事务,对于 tx=1 < /强>, cSave>强>值
SELECT * , DENSE_RANK() over (ORDER BY csave desc, tx) AS rank
FROM noma_d.setu_test.report_result
结果是:
在上述事务中,对于相同的发送,csave列的值相同。让我们考虑下面的事务,对于<强> tx=1 < /强>,<强> cSave>强>值不同。
现在,如果我执行上述相同的查询,那么我得到的结果是:
这里,tx=1的一个事务具有rank=2,而tx=1的另一个事务具有rank=5。但是我想把tx=1的所有事务赋给rank=2作为tx=1的一个事务赋给2,因此tx=1的其余事务也必须赋给rank2
预期输出如下所示:
我将如何通过修改上述查询来实现这一点?您需要在排名前按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
正如JohnHC所回答的,需要在排名前按tx分组,并使用rank()代替行数()。最后一个问题是:
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
谢谢您的回复@JohnHC。但如果我执行您的查询,那么两个不同的tx的排名将是相同的。对于给定的事务,tx=1和tx=4的排名将为2。但它们需要有所不同。预期输出是tx=1的秩将为2,tx=4的秩将为3,反之亦然。虽然csave列的值对于相同的tx编号是相同的,但表示秩不能相等。您可以在此处看到查询的输出,将
densite\u rank
替换为rank
或row\u number
。前者为相等的值提供公共秩,而用秩代替稠密秩不会满足我的期望output@setubasak我的意思是在上面的查询中替换,而不是在原始查询中,这就是为什么我在这里放了一条评论,而不是另一条回复。你试过了吗?rank
将给你相同的值,如果你有tx
和相同的max(csave)
,对于你想要的输出(不同的tx
没有重复的秩值),你必须使用行号