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

Sql server 从单独的表中按id元组分组的sql server最大记录值,sql-server,max,Sql Server,Max,有很多问题已经在问,如何做一个一般的最大值组由一些id。但我的具体情况有所不同 我拥有的是一个记录,其值链接到与该记录相关联的任何未知数量的概要文件。为了简单起见,在本例中,每个团队有2个配置文件,但实际示例可以有任何大小 根据这些记录,我试图创建一个排行榜,以显示每个独特团队形成的最大记录,即使团队多次获得相同的最大值,也应该只显示一个结果 在本例中,唯一的团队是1,2和2,3。 :独特的团队形成意味着排行榜应该考虑所有的档案1, 2,作为一个独特的ID,是同一个独特的团队,如果有相同的团队可

有很多问题已经在问,如何做一个一般的最大值组由一些id。但我的具体情况有所不同

我拥有的是一个记录,其值链接到与该记录相关联的任何未知数量的概要文件。为了简单起见,在本例中,每个团队有2个配置文件,但实际示例可以有任何大小

根据这些记录,我试图创建一个排行榜,以显示每个独特团队形成的最大记录,即使团队多次获得相同的最大值,也应该只显示一个结果

在本例中,唯一的团队是1,2和2,3。 <编辑>:独特的团队形成意味着排行榜应该考虑所有的档案1, 2,作为一个独特的ID,是同一个独特的团队,如果有相同的团队可能已经多次形成不同的记录。 在本例中,团队1,2具有重复的最大记录值1,该值应忽略重复。 假设was有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构建正确的查询,那就太棒了


谢谢

经过一系列的研究和反复试验,我得出了以下答案,解决了我的问题。此查询将给出两人团队排行榜中每个团队的最高分:

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;

它的工作原理是运行一个分区,按团队对所有记录进行排名,然后只提取排名第一的记录。where m1.profileId1,2和2,3是如何唯一的?另外,您是否可以用适当的表名标记每个数据集,以便易于理解?您的解释与您发布的数据不同步。我已更新了要同步的名称和查询。由概要文件1和概要文件2组成的团队与由概要文件2和概要文件3组成的团队一样,是一个独特的团队,尽管团队可能由相同的用户组成多次。例如,我和你尝试同一个活动3次,将会有3套我和你,但是从排行榜的角度来看,它只应该把我们看作1个团队来代表。