为此问题编写sql查询: 根据每位顾客尝试过的菜肴的多样性对他们进行排名(排名 1 为最高)。分配一个独特的排名;排名不应重复。
预期输出:consumer_id、不同的菜系_tried、diversity_rank 以相同的顺序。
对 Cuisines_tried 进行降序排序,然后对diversity_rank进行升序排序,然后对consumer_id进行升序排序。
我已经编写了这段代码,但它抛出了错误的答案:
WITH cte AS (
SELECT
consumer_id,
COUNT(DISTINCT preferred_cuisine) AS cuisine_tried
FROM
CONSUMER_CUISINE_PREFERENCES
GROUP BY
consumer_id
)
SELECT
consumer_id,
cuisine_tried,
RANK() OVER (ORDER BY cuisine_tried DESC) AS rrank
FROM
cte
ORDER BY
cuisine_tried DESC,
rrank ASC,
consumer_id ASC;
您的 SQL 查询很接近,但需要进行一些调整才能实现所需的排名和输出格式。主要问题是您正确使用
RANK()
,但最终选择中的列名称应与您在 CTE 中使用的名称相匹配。此外,您应该确保最后的 ORDER BY
子句与指定的排序顺序匹配。
这是更正后的 SQL 查询:
WITH cte AS (
SELECT
consumer_id,
COUNT(DISTINCT preferred_cuisine) AS distinct_cuisines_tried
FROM
CONSUMER_CUISINE_PREFERENCES
GROUP BY
consumer_id
)
SELECT
consumer_id,
distinct_cuisines_tried,
DENSE_RANK() OVER (ORDER BY distinct_cuisines_tried DESC) AS diversity_rank
FROM
cte
ORDER BY
distinct_cuisines_tried DESC,
diversity_rank ASC,
consumer_id ASC;
cuisine_tried
中的 distinct_cuisines_tried
更改为 SELECT
以匹配 CTE。DENSE_RANK()
:这将确保无间隙的唯一排名。如果你想保持唯一的排名而不重复,在这种情况下DENSE_RANK()
是更好的选择。ORDER BY
子句正确:distinct_cuisines_tried
降序,diversity_rank
升序,consumer_id
升序。此查询现在应该根据您的要求提供预期的输出。
如果这有帮助,请标记为已回答。