sql server最大记录值按id元组从单独的表中分组

时间:2017-07-20 22:43:33

标签: sql-server max

在SO上已经有很多问题,询问如何通过某个id对组进行一般最大值。但是我的具体情况有所不同。

我所拥有的是一个记录,其值可链接到与该记录关联的任何未知数量的配置文件(作为"团队")。为简单起见,示例中每个团队都有2个配置文件,但真实示例可以有任何大小。

根据这些记录,我试图创建一个排行榜,以显示每个独特球队阵型的最大记录,并且只应显示一个结果,即使球队不止一次得分相同的最大值。

  • 在此示例中,唯一的团队是(1,2)和(2,3)。
编辑:独特的团队形成意味着排行榜应该将所有带有个人资料(1,2)的记录视为团队的唯一形式(如果有帮助,则作为唯一ID),即使同一团队可能已经形成不同记录多次。

  • 在此示例中,团队(1,2)的重复最大记录值为1,应忽略副本。

让我们说有3个用户:

Table: profile
profileId | name
1         | John
2         | James
3         | Mark

然后我们可以说目前有以下记录:

Table: record
recordId | value
1        | 1
2        | 1
3        | 2
4        | 3

最后,每条记录都由其成员描述的以下团队组成:

Table: member
recordId | profileId
1        | 1
1        | 2         
2        | 1
2        | 2
3        | 2
3        | 3
4        | 3
4        | 2

最终输出应如下所示:

recordId | profileId1 | profileId2 | value
4        | 2          | 3          | 4
1 (or 2) | 1          | 2          | 0

到目前为止,如果组ID是记录的一部分,我似乎也是这样的:

SELECT  * 
FROM (SELECT *,
    ROW_NUMBER() OVER (PARTITION BY profileId ORDER BY value DESC) N
    FROM record
) M WHERE N = 1

这实际上得到了独特的元组:

select max(r.value) as value, p1.profileId as p1, p2.profileId as p2 
from record r 
inner join profile p1 on p1.recordId = r.id 
inner join profile p1 on p2.recordId = r.id  
where p1.profileId < p2.profileId
group by p2.profileId, p2.profileId

但是,我不知道如何拼凑它以获得每个元组的最大记录。

此外,第二个查询对于任何未知数量的配置文件都不具有可扩展性,如果有办法在没有自我加入的情况下根据可能是奖励的配置文件数量进行自我加入!

如果有人可以帮我构建适合SQL Server的查询,那将是非常棒的。

谢谢!

1 个答案:

答案 0 :(得分:0)

经过一番研究和反复试验后,我得出了以下答案,解决了我的问题。此查询将为每个团队提供2人团队排行榜的最高分数:

SELECT * FROM
    (
        SELECT ROW_NUMBER() OVER (PARTITION BY m1.profileId, m2.profileId, m3.profileId ORDER BY r.value DESC) N,
            m1.profileId AS m1, m2.profileId AS m2, m3.profileId AS m3, r.value, r.id 
        FROM record r
        INNER JOIN member m1 ON m1.recordId = r.id 
        INNER JOIN member m2 ON m2.recordId = r.id 
        WHERE m1.profileId < m2.profileId
    ) R
where N = 1
ORDER BY value DESC;

它的工作原理是运行一个分区来按团队排列所有记录,然后只获取排名为1的记录。其中m1.profileId&lt; m2.profileId确保在结果中仅使用团队的1个排列。