【问题标题】:Select max value AND the corresponding row id grouped by date选择最大值和按日期分组的相应行ID
【发布时间】:2020-11-16 19:23:30
【问题描述】:

我有一个(mssql)排名表,它有一个id、一个用户名、一个日期和一个 score 属性。

id | username | date | score
----------------------------
1      joe    01/2020  200
2      bob    01/2020  300
3      max    02/2020  350
4      jane   02/2020  300
5      bob    02/2020  250
6      joe    03/2020  150

我想要实现的是选择按日期分组的最高分,并带有相应的 id 和用户名,这将产生如下结果:

id | username | date | score
----------------------------
2      bob    01/2020  300
3      max    02/2020  350
6      joe    03/2020  150

我绝不是数据库专家,我失败得很惨!

有人可以帮我解决这个问题吗?谢谢!

编辑:此时我不关心关系。

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。如果你有领带怎么办?
  • 这是一个 mssql 数据库。 (我只是更改了标签。)在这一点上,我不在乎领带。每个日期我需要一个用户(得分最高),即使在这个日期实际上有更多的用户得分相同......

标签: sql sql-server database select group-by


【解决方案1】:

如果您的数据库支持窗口函数:

Select * from (Select t.*,
row_number() OVER (Partition by date order by score desc)  rn
from table t) where rn = 1;


+----+----------+---------+-------+----+
| id | username | dte     | score | rn |
+----+----------+---------+-------+----+
|  2 | bob      | 01/2020 |   300 |  1 |
+----+----------+---------+-------+----+
|  3 | max      | 02/2020 |   350 |  1 |
+----+----------+---------+-------+----+
|  6 | joe      | 03/2020 |   150 |  1 |
+----+----------+---------+-------+----+

【讨论】:

  • 我听从了你的建议,结果对我有用!谢谢!当我使用 mssql 数据库时,我不得不稍微调整一下您的查询: Select * from (Select t.*, row_number() OVER (Partition by date order by score desc) rn from score_table t) as tmp where tmp.rn = 1;
【解决方案2】:

像下面这样试试

select a.* form table_name a
where a.score=( select max(score) from table_name b where a.date=b.date )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 2012-10-08
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多