【问题标题】:Sort table by group with highest sum and displaying individual entries按总和最高的组对表格进行排序并显示单个条目
【发布时间】:2013-06-05 23:27:49
【问题描述】:

我有以下情况,我想订购表格并按总和最高到最低的组排列

 name   score
----------------
  abc    10
  pqr    9
  abc    7
  pqr    3
  abc    10
  xyz    7
  pqr    7
  xyz    3
  xyz    2

现在如果我们观察,

总计 (abc) = 10 + 7 + 10 = 27

总计 (pqr) = 9 + 3 + 7 = 19

总计 (xyz) = 7 + 3 + 2 = 12

如何按总和最高的组对SQL 中的上表进行排序,并且应该显示单个条目?

Expected output:
----------------
name   score 
----------------
abc    10
abc    10
abc    7
pqr    9
pqr    7
pqr    3
xyz    7
xyz    3
xyz    2

【问题讨论】:

  • MySQL、SQL-Server、Oracle、PostgreSQL 等?
  • 嗨,Dems,对不起,我没有提到它!它的“SQLite”

标签: sql sqlite group-by sql-order-by


【解决方案1】:

SQLite 没有分析/窗口函数,因此您需要自己计算出不同的数据。

SELECT
  yourTable.*
FROM
  yourTable
INNER JOIN
(
  SELECT name, SUM(score) AS score FROM yourTable GROUP BY name
)
  AS totalScores
    ON totalScores.name = yourTable.name
ORDER BY
  totalScores.score DESC,
  yourTable.name,
  yourTable.score   DESC


在这个查询中,有一个子查询。子查询计算每个名称的 totalScore。

然后,您可以将总分放在 ORDER BY 子句中。注意,我不会在我的结果中选择总分,你可以但不是必须的。

另外,我已将名称放在 ORDER BY 中。这样一来,如果有多个姓名的总分相同,则按字母顺序排在第一位的姓名将首先显示。

【讨论】:

  • 好吧!我会试试这个,然后会回到这里.. 谢谢
  • 天才.. 谢谢。我认为“ORDER BY totalScores.score DESC”就足够了吗?是否需要“yourTable.score DESC”如果我错了请纠正我。我也无法理解“如果有多个名字共享相同总分的平局”......在解释中。
  • 假设您有 8、8、8 的 ABC 数据和 9、8、7 的 DEF 数据。他们的总分都是 24。我编写示例的方式保证您首先获得 ABC 的三行,然后是 DEF 的三行。我还确保将子分数排在第一位,这在您的示例中是这样,但是您是否需要它取决于您:)
【解决方案2】:

如果你使用 SQL-Server,一种方法是使用SUM(score)OVER(PARTITION BY name)

SELECT name,
       score,SUM(score)OVER(PARTITION BY name)
FROM dbo.TableName
ORDER BY SUM(score)OVER(PARTITION BY name) DESC,
         score DESC

DEMO

OVER Clause (Transact-SQL)

【讨论】:

  • OP 更新说它是 SQLite (我认为它没有这个功能?)
  • @Dems:不,它没有。我在 sql-server 上为人们保留答案 ;)
  • 在这种情况下,我会考虑将name 添加到ORDER BY。如果两个名称可能具有相同的 SUM(score) 值,则操作可能希望将每个名称组合在一起。 (或者也许还有MAX(score) OVER() 作为二级抢七。)
猜你喜欢
  • 1970-01-01
  • 2023-01-26
  • 2020-11-21
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2015-02-11
  • 1970-01-01
  • 2022-01-25
相关资源
最近更新 更多