【问题标题】:RFM Analysis - Value keeps changingRFM 分析 - 价值不断变化
【发布时间】:2020-02-17 19:53:40
【问题描述】:

得到以下查询。

SELECT
    customer_id,
    NTILE(5) OVER (ORDER BY MAX(oms_order_date)) AS r_score
FROM 
    mdwh.us_raw.l_dmw_order_report
WHERE 
    quantity_ordered > 0
    AND customer_id IS NOT NULL
    AND customer_id != ('')
    AND UPPER(line_status) NOT IN ('','RETURN', 'CANCELLED')
    AND UPPER(item_description_1) NOT IN ('','FREIGHT', 'RETURN LABEL FEE', 'VISIBLE STITCH')
    AND (quantity_ordered * unit_price_amount) > 0
    AND extended_amount < 1000 --NO BULK ORDERS
    AND oms_order_date BETWEEN '2020-01-01' AND '2020-01-01'
    AND SUBSTRING(upc,1,6) IN (SELECT item_code FROM item_master_zs WHERE new_division BETWEEN '11' AND '39')
GROUP BY
    customer_id
ORDER BY
    customer_id

我在这里所做的只是,在某些条件下,给我唯一的客户 ID,然后将他们的最新购买日期分成五分位数,并在第二列中为我提供分数。但是每次我运行查询时,r_score 值都会不断变化?我究竟做错了什么..?这是表格的外观(同样,r_score 值不断变化):

【问题讨论】:

    标签: sql amazon-redshift aginity


    【解决方案1】:

    ntile() 的问题在于,它通过在不同的组中放置相同的值来确保组的大小完全相同。

    因此,我通常使用rank()手动进行计算:

    ceil(rank() over (order by max(oms_order_date)) * 5.0 /
         count(*) over ()
        ) as r_score
    

    如果你使用row_number(),你会得到ntile()的等价物。

    如果你想使用ntile(),你可以使用额外的order by键,这样排序键是唯一的。

    ====================

    2/17/20 下午 5:18 编辑

    这是我正在使用的新代码:

    SELECT
        customer_id,
        CEIL(RANK() OVER (ORDER BY MAX(oms_order_date)) * 5 / COUNT(*) OVER ()) AS r_score,
        CEIL(RANK() OVER (ORDER BY COUNT(client_web_order_number)) * 5 / COUNT(*) OVER ()) AS f_score,
        CEIL(RANK() OVER (ORDER BY AVG(extended_amount)) * 5 / COUNT(*) OVER ()) AS m_score,
        (r_score || f_score || m_score) AS rfm_score
    FROM 
        mdwh.us_raw.l_dmw_order_report t1
    WHERE 
        quantity_ordered > 0
        AND customer_id IS NOT NULL
        AND customer_id != ('')
        AND oms_order_date IS NOT NULL
        AND UPPER(line_status) NOT IN ('','RETURN', 'CANCELLED')
        AND UPPER(item_description_1) NOT IN ('','FREIGHT', 'RETURN LABEL FEE', 'VISIBLE STITCH')
        AND (quantity_ordered * unit_price_amount) > 0
        AND extended_amount < 1000 --NO BULK ORDERS
        AND oms_order_date BETWEEN '2020-01-01' AND '2020-01-10'
        AND SUBSTRING(upc,1,6) IN (SELECT item_code FROM item_master_zs WHERE new_division BETWEEN '11' AND '39')
    GROUP BY
        customer_id
    ORDER BY
        customer_id
    

    现在的问题是我得到了一些带有空白 r_score 的行,最大值是 4 而不是 5..

    【讨论】:

    • 感谢@GordonLinoff 的快速回复。请您多解释一下第一个查询的工作原理(逐步)。我对 SQL 还是有点菜鸟,所以想赶上。我猜我有点不知所措,因为你提到了 3 种方法,如果我没记错的话
    • @zain 。 . .我不知道你指的是什么。我认为替换代码我很清楚。这仅提及您的问题的一个答案以及一些其他信息。
    • 我已经用您提供的 rank() 查询更新了我最初的问题。有一些问题。 @戈登林诺夫
    • @zain 。 . .我没有看到任何更新。您的问题(如第一段所述)是您有许多具有相同值的行。 ntile() 将它们放在不同的瓷砖中。手动计算确保所有值都在同一个图块中,但图块的大小不同。
    • @zain 。 . .我的代码有5.0。你的有5。这会有所不同。
    猜你喜欢
    • 2017-08-16
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多