Sql 红移:使用带条件的秩

Sql 红移:使用带条件的秩,sql,amazon-redshift,Sql,Amazon Redshift,我正在尝试添加一个排名编号,仅适用于已交付的购物车。我尝试了下面的代码,但没有得到预期的结果 我们可以在单个查询中实现这一点,或者我们需要为交付的Cart编写一个子查询并生成一个排名。请在此提出建议 数据: 客户识别码 车号 购物车的当前状态 排名 已交付\u等级 1. 100 交付 1 1 1. 110 取消 2 NULL 1. 220 交付 3 2 您可以在此处使用COUNT作为分析函数以及CASE表达式: 选择 客户识别码, 车号, 目前的状况, 在(按客户id按订单按购物车id划分)购物

我正在尝试添加一个排名编号,仅适用于已交付的购物车。我尝试了下面的代码,但没有得到预期的结果

我们可以在单个查询中实现这一点,或者我们需要为交付的Cart编写一个子查询并生成一个排名。请在此提出建议

数据:

客户识别码 车号 购物车的当前状态 排名 已交付\u等级 1. 100 交付 1 1 1. 110 取消 2 NULL 1. 220 交付 3 2
您可以在此处使用
COUNT
作为分析函数以及
CASE
表达式:

选择
客户识别码,
车号,
目前的状况,
在(按客户id按订单按购物车id划分)购物车排名asc上的稠密排名(),
当前_状态为“已交付”时的情况
然后计数(当前_状态为“已交付”然后为1结束时的情况)
(按客户id划分按购物车id划分订单)结束交货等级
来自销售部的详细信息
订购人
客户识别码,
购物车id;

上面使用的
CASE
表达式将为非状态传递记录的任何记录呈现
NULL
。否则,它将显示每个客户记录块的已交付记录的滚动计数。

我将通过两种方式调整您的查询


  • cart\u当前\u状态添加到
    分区中
  • 这意味着所有
    交付的
    购物车都有自己的排名,所有
    取消的
    购物车都有自己的排名


  • 将该排名包装在一个
    案例中
    表达式中,以仅包括
    已交付
    购物车的排名
  • 这将使
    取消的
    购物车的排名变为



    注意:根据您的数据和解释,
    COUNT(*)
    SUM(1)
    densite\u RANK()
    ,等等,都会给出相同的结果。

    请通过添加示例数据,将此作为一个完整的问题。通过一些示例源数据,我们可以看到您正在处理和未处理的场景,然后,您还可以提供从该示例源数据预期的示例结果。这使我们能够验证我们的理解,并证明任何答案都会产生您期望的结果。@TimBiegeleisen:添加了示例数据
    SELECT
        customer_id,
        cart_id,
        current_status,
        DENSE_RANK() OVER (PARTITION BY customer_id ORDER BY cart_id) AS cart_rank_asc,
        CASE
          WHEN cart_current_status = 'DELIVERED'
          THEN DENSE_RANK() OVER (PARTITION BY customer_id, cart_current_status ORDER BY cart_id)
        END
          AS delivered_rank
    FROM
        sales_details
    ORDER BY
        customer_id,
        cart_id;