【问题标题】:Average and group by in SQL but for best 10 records onlySQL 中的平均值和分组依据,但仅用于最佳 10 条记录
【发布时间】:2016-10-24 12:35:01
【问题描述】:

Given:一个排名表(id、user_id、score、group_id、date)

目前我们根据所有参与用户的总和和平均来计算排名。

SELECT
    ROUND(AVG(r.score)::NUMERIC, 2) AS score,
    SUM(score) AS score_sum,
    MAX(r.date) AS ranking_timestamp,
    a.name AS group_name,
    a.id AS group_id
FROM
ranking r, group a
WHERE a.id = r.group_id
GROUP BY a.id,a.name
ORDER BY AVG(r.score) DESC,MAX(r.date) ASC

现在我们想改变它。不尊重所有参与用户,而是只选取 10 个最佳用户,计算 SUM 和 AVG。

这可能在一个语句中吗?

【问题讨论】:

  • 最好 - 根据什么?那么领带呢?
  • 也许一种方法是使用子查询来获得最好的 10 个,然后运行分组查询。

标签: sql limit average ranking partition


【解决方案1】:

你可以这样做:

WITH TEMP AS
    (
        SELECT
            ROUND(AVG(r.score)::NUMERIC, 2) AS score,
            SUM(score) AS score_sum,
            MAX(r.date) AS ranking_timestamp,
            a.name AS group_name,
            a.id AS group_id
        FROM
        ranking r, group a
        WHERE a.id = r.group_id
        GROUP BY a.id,a.name
        ORDER BY AVG(r.score) DESC,MAX(r.date) ASC
    )


SELECT TOP 10 * FROM TEMP ORDER BY score ASC

【讨论】:

    【解决方案2】:

    添加TOP 10

    SELECT TOP 10
        ROUND(AVG(r.score)::NUMERIC, 2) AS score,
        SUM(score) AS score_sum,
        MAX(r.date) AS ranking_timestamp,
        a.name AS group_name,
        a.id AS group_id
    FROM
    ranking r, group a
    WHERE a.id = r.group_id
    GROUP BY a.id,a.name
    ORDER BY AVG(r.score) DESC,MAX(r.date) ASC
    

    【讨论】:

      猜你喜欢
      • 2021-11-20
      • 1970-01-01
      • 2013-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-25
      • 1970-01-01
      相关资源
      最近更新 更多