连接和聚合函数

时间:2014-08-07 13:19:28

标签: sql tsql join aggregate-functions

我有3张桌子需要加入。一旦我加入前两个,我就会有两列,让我们称之为AB

AB之间的关系是多对多的。所以我们可以:

A    B
1    1 
1    2
2    1
2    3

然后,我需要加入B栏上的第三个表格,给我:

A    B    C
1    1    5 
1    2    6
2    1    9
2    3    2

现在,对于我的最终结果,我只想为每个唯一A值添加一行,并且我希望根据给定{{1}的MAX C值选择该行}}

所以在这个例子中,最终的值是:

A

我有以下查询按预期工作,但我相当肯定这不是最好的方法:

A    B    C
1    2    6
2    1    9

1 个答案:

答案 0 :(得分:1)

您的查询可以简化:

  1. 您在子查询中不需要select distinct
  2. 您不需要加入T3
  3. 您可以在子查询中选择C值。
  4. 以下是修订版:

    SELECT Temp.A, Temp.B, Temp.C
    FROM (SELECT T1.A, T2.B, T3.C, MAX(T3.C) OVER (PARTITION BY T1.A) AS C1
          FROM T1 INNER JOIN
               T2
               ON T1.X = T2.X INNER JOIN
               T3
               ON T2.B = T3.B
         ) Temp
    WHERE Temp.C1 = Temp.C
    

    请注意,如果T3具有重复的最大值,则会返回重复项。要获得一个,您可以使用row_number()代替:

    SELECT Temp.A, Temp.B, Temp.C
    FROM (SELECT T1.A, T2.B, T3.C,
                 ROW_NUMBER() OVER (PARTITION BY T1.A ORDER BY T3.C DESC) AS seqnum
          FROM T1 INNER JOIN
               T2
               ON T1.X = T2.X INNER JOIN
               T3
               ON T2.B = T3.B
         ) Temp
    WHERE seqnum = 1;