Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在红移中按自定义顺序排列事务?_Sql_Amazon Redshift - Fatal编程技术网

Sql 如何在红移中按自定义顺序排列事务?

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>强>值

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

事务需要按csave列的降序排列,具有相同tx编号的事务将获得相同的排名。因此,我执行以下查询:

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
没有重复的秩值),你必须使用
行号