为给定的 qsn 编写 SQL 查询

问题描述 投票:0回答:1

为此问题编写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 mysql postgresql
1个回答
0
投票

您的 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;

主要变化:

  1. 列名称一致性:将最终
    cuisine_tried
    中的
    distinct_cuisines_tried
    更改为
    SELECT
    以匹配 CTE。
  2. 使用
    DENSE_RANK()
    :这将确保无间隙的唯一排名。如果你想保持唯一的排名而不重复,在这种情况下
    DENSE_RANK()
    是更好的选择。
  3. 最终排序:根据您的要求确认最终的
    ORDER BY
    子句正确:
    distinct_cuisines_tried
    降序,
    diversity_rank
    升序,
    consumer_id
    升序。

此查询现在应该根据您的要求提供预期的输出。

如果这有帮助,请标记为已回答。

© www.soinside.com 2019 - 2024. All rights reserved.