金额以实际价格为准

时间:2019-07-05 18:34:54

标签: sql sql-server case

请随时更改或建议我更改标题,以更好地表达我要问的问题。

我有一个查询,给出以下结果:

    select 
    Customer.customer_id,
    Transaction.amount

    From Customer inner join Transaction on Customer.customer_id = Transcation.coustomer_id

结果:

    customer_id| amount

    01456   |50
    01456   |100
    01456   |400  
    01456   |0

    01963   |50
    01963   |100
    01963   |221
    01963   |0

现在,我想添加一个优先级字段,为我提供1、2或3的优先级。数值越小,优先级越高。注意:我想用文字“ Negative”代替0。排名金额期望为0。

这就是我想要的。

    customer_id| amount| priority

    01456|    50|   3
    01456|   100|   2
    01456|   400|   1
    01456|     0|   Negative

    01963|    50|   3
    01963|   100|   2
    01963|   221|   1
    01963|     0|   Negative

这可以实现吗?非常感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

ROW_NUMBER()这样的窗口函数非常适合:

SELECT c.customer_id,
       t.amount,
       ROW_NUMBER() over (PARTITION BY customer_id ORDER BY amount desc) priority
FROM Customer c
JOIN [Transaction] t on c.customer_id = t.customer_id

partition by重置每个唯一customer_id的编号,而order by决定对行进行编号的方向和顺序。

答案 1 :(得分:0)

使用row_number()rank()

select customer_id, amount,
       row_number() over (partition by customer_id order by amount desc) as priority
from t;