• 方法思路是利用DENSE_RANK()代替COUNT(DISTINCT ),问题在于如果当天没有数据,那么结果将不显示,如在结果测试中,10-2号附近的销售量为0,结果不输出。
WITH t1 AS
(
SELECT product_id
        , '2021-10-01' AS dt
        , DENSE_RANK() OVER(ORDER BY product_id )+DENSE_RANK() OVER(ORDER BY product_id DESC)-1 AS sale
        , (SELECT COUNT(DISTINCT product_id)
            FROM tb_product_info
            WHERE shop_id = 901) AS total_sales
FROM tb_product_info
JOIN tb_order_detail USING(product_id)
JOIN tb_order_overall USING(order_id)
WHERE DATEDIFF('2021-10-01', event_time) BETWEEN 0 AND 6 AND shop_id = 901

UNION ALL
SELECT product_id
        , '2021-10-02' AS dt
        , DENSE_RANK() OVER(ORDER BY product_id )+DENSE_RANK() OVER(ORDER BY product_id DESC)-1 AS sale
        , (SELECT COUNT(DISTINCT product_id)
            FROM tb_product_info
            WHERE shop_id = 901) AS total_sales
FROM tb_product_info
JOIN tb_order_detail USING(product_id)
JOIN tb_order_overall USING(order_id)
WHERE DATEDIFF('2021-10-02', event_time) BETWEEN 0 AND 6 AND shop_id = 901

UNION ALL
SELECT product_id
        , '2021-10-03' AS dt
        , DENSE_RANK() OVER(ORDER BY product_id )+DENSE_RANK() OVER(ORDER BY product_id DESC)-1 AS sale
        , (SELECT COUNT(DISTINCT product_id)
            FROM tb_product_info
            WHERE shop_id = 901) AS total_sales
FROM tb_product_info
JOIN tb_order_detail USING(product_id)
JOIN tb_order_overall USING(order_id)
WHERE DATEDIFF('2021-10-03', event_time) BETWEEN 0 AND 6 AND shop_id = 901
)

SELECT dt
        , ROUND(AVG(sale/total_sales), 3) AS sale_rate
        , ROUND(1 - AVG(sale/total_sales), 3) AS unsale_rate
FROM t1
GROUP BY dt