我想在过去的一个月中,显示每个组中每月有多个值的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
在这种聚合水平上苦苦挣扎!
我很满意至少在正确的方向上轻推。
答案 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
(在其他情况下,您可能需要RANK
或DENSE_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;