在查询中聚合有问题

时间:2016-12-08 13:22:14

标签: sql sql-server sql-server-2008

我想在过去的一个月中,显示每个组中每月有多个值的10个组中的最高值。

我正在路上;

SELECT 
    Group, MAX(Value), Date
FROM
    <relevant tables>
GROUP BY
  Group, Date

但是这会返回群组中的所有内容,我需要在整个时期内各自获得最高分(例如,对于0007行之一,只需'0007''1002415.59''2016-11-11'

0007    27456.14    2016-11-07
0082    2406.30     2016-11-07
0007    33038.34    2016-11-08
0082    569.37      2016-11-08
0007    1274.78     2016-11-09
0088    2266.00     2016-11-09
0007    124.57      2016-11-10
6082    2407.27     2016-11-10
0007    1002415.59  2016-11-11
0882    90.30       2016-11-11
0477    67.90       2016-11-12
0067    66.33       2016-11-13

在这种聚合水平上苦苦挣扎!

我很满意至少在正确的方向上轻推。

3 个答案:

答案 0 :(得分:2)

执行此操作的典型方法是使用ANSI标准row_number函数:

with t as (
      SELECT . . .
      FROM <relevant tables>
     )
select t.*
from (select t.*,
             row_number() over (partition by grp order by date desc) as seqnum
      from t
     ) t
where seqnum = 1;

CTE仅用于封装您当前的逻辑。

答案 1 :(得分:0)

这可能有点冗长,但它应该有助于您了解如何将其拆分成小部分。如果您有性能方面的考虑因素,可以重新编写和优化查询。

选择         Group,MAX(Value)as MaximumValue,Date INTO #tmpGroupMaximumValue     从              通过...分组       集团,日期

SELECT 
Group,DENSE_RANK() OVER (
        PARTITION BY A.Group ORDER BY A.MaximumValue DESC
        ) as [MaxGroupValueRank], [Date] INTO #tmpB
 FROM #tmpGroupMaximumValue A


SELECT * FROM #tmpB WHERE [MaxGroupValueRank] = 1

答案 2 :(得分:0)

首先:GROUP BY x, y, z表示&#34;我想要每个x-y-z组合一个结果行&#34;。您正在使用GROUP BY Group, Date,因此您不应对每个组和日期获得一个结果行感到惊讶。每组获得一个结果行必须为GROUP BY Group

但是,您根本不寻找聚合(即查看一个组的记录并从中收集数据)。你想要做的就是显示某些记录,而不显示其他记录。这是在WHERE中完成的。为了对您的记录进行排名,您需要使用ROW_NUMBER(在其他情况下,您可能需要RANKDENSE_RANK)。

SELECT [Group], Value, [Date]
FROM
(
  SELECT 
    [Group], Value, [Date],
    row_number() over (partition by [Group] order by Value desc) as rn
  FROM <relevant tables>
) data
WHERE rn = 1;