【问题标题】:Uniquely identify groups of game scores that are tied唯一识别并列的游戏分数组
【发布时间】:2015-08-24 21:57:06
【问题描述】:

我有一个包含 TeamId、GameId、IsWin 和 IsLoss 列的集合。我想编写一个查询,不仅总结每个团队的输赢,而且我还想创建一个列来唯一标识具有相同输赢数量的团队的 .换句话说,如果一支球队的胜负数与其他一支或更多支球队相同,那么他们应该共享同一个“TieGroup”

例如,如果我总结输赢,按Wins DESC, Losses ASC排序,得到这个结果:

Team  W L
Team1 4 0
Team2 4 0
Team3 3 1
Team4 1 3
Team5 0 4
Team6 0 4

然后在我添加列来分组并列球队后,我会期待这个结果

Team  W L TieGroup
Team1 4 0 1
Team2 4 0 1
Team3 3 1 2
Team4 1 3 3
Team5 0 4 4
Team6 0 4 4

Team1 和 Team2 并列,因此属于同一组。 Team3 和 Team4 的记录与其他任何团队都不同,因此他们各自拥有自己的小组。 Team5 和 Team6 也打成平手,所以他们在同一组中。

我该怎么做?我尝试使用row_count()rank(),但没有得到我想要的结果。

【问题讨论】:

  • 下次尝试提供SqlFiddle 之类的内容,以便我们更快地给您答复
  • DENSE_RANK() 怎么样?
  • 我认为 rank() 可以完成这项工作,您尝试过什么?
  • 感谢@JuanCarlosOropeza,我不知道 SqlFiddle 存在。下次一定会用。

标签: sql sql-server sql-server-2012


【解决方案1】:

使用 DENSE_RANK()

SQLFiddleDemo

CREATE TABLE tab(team NVARCHAR(100), win INT, lose INT);

INSERT INTO tab(team, win, lose)
VALUES ('Team1', 4, 0), ('Team2', 4, 0), ('Team3', 3, 1), 
       ('Team4', 1, 3), ('Team5', 0, 4), ('Team6', 0, 4); 

SELECT 
   team
  ,win
  ,lose
  ,[tie_group] = DENSE_RANK() OVER (ORDER BY win DESC, lose ASC)
FROM tab;

【讨论】:

  • 谢谢,我尝试了 DENSE_RANK(),但我将胜负放在了 Partition By 中,这就是搞砸的原因。我没想过要放弃它。这是您的 SqlFiddle 的一个版本,也可以进行求和:sqlfiddle.com/#!6/f1fa5/2/0
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-13
  • 2022-10-15
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
  • 2020-02-22
  • 2011-01-24
相关资源
最近更新 更多