我需要按级别1总结'VALUE',并且需要选择每组中的前1个值(级别2到级别5),其中max(mod日期)在max(year_month)内。
编辑:前1 - > year_month的最新moddate
level1 | level2 | level3 | level4 | level5 | year_month | VALUE | moddate
123 | 222 | 333 | 444 | 555 | 201403 | 110.00 | 2014-01-05
123 | 222 | 333 | 444 | 555 | 201403 | 100.00 | 2013-12-11
123 | 222 | 333 | 444 | 777 | 201403 | 50.00 | 2014-01-01
123 | 333 | 333 | 5555 | 777 | 201401 | 200.00 | 2014-01-01
122 | 222 | 333 | 444 | 888 | 201403 | 60.00 | 2014-01-01
结果
level1 SUM
123 360
122 60
我看了各种“群组中的顶级x”问题,但我无法让它为我工作。
我能想到的唯一“解决方案”是使用游标并循环到所有级别,但必须有更好的方法来执行此操作。
有什么建议吗?
由于
答案 0 :(得分:0)
试试这个:
select level1, SUM(value) sum
from(
select h.level1, h.VALUE
from Huh h
where year(h.moddate) = h.year_month/100
) x
group by level1
答案 1 :(得分:0)
根据我的理解你的要求,你要总结所有项目level1,其中moddate< = yearmonth和moddate = max(moddate)
select level1, sum(value) as SUM
FROM
(
select level1, value, year_month, moddate
max(moddate) OVER (PARTITION BY level1 ORDER BY year_month DESC) as maxmoddate
from table
)
WHERE moddate = maxmoddate and
(year(moddate)*100)+month(moddate) <= year_month
group by level1
答案 2 :(得分:0)
你的解释和期望的结果有点矛盾(至少就我能解释它而言),但这应该遵循你对你想要的描述。对于level1的每个值,它将为您提供level2-level5的最大值以及在某个year_month之前可用的最新year_month的所有值的总和;
WITH cte AS (
SELECT level1, year_month,
MAX(level2) level2, MAX(level3) level3, MAX(level4) level4, MAX(level5) level5,
SUM(value) [sum],
RANK() OVER (PARTITION BY level1 ORDER BY year_month DESC) rn
FROM table1
WHERE year_month < 201402
GROUP BY level1, year_month
)
SELECT level1, level2, level3, level4, level5, sum FROM cte WHERE rn=1;
唯一棘手的问题是RANK() OVER()
用于查找每个级别1可用的最新月份。最近一个月将得到一个rn = 1的值,然后用它来过滤外部选择中的值。
答案 3 :(得分:0)
您的描述并不完全清楚,但如果该示例应该支持它,那么我将得出以下结论:
您希望将数据集拆分为level1, level2, level3, level4, level5, year_month
组。
您只想要year_month
中相应超级组level1, level2, level3, level4, level5
中VALUE
为最大值的组。
要从每个组中提取一个VALUE
。
提取的moddate
必须与群组中的最新moddate
相对应。 (我的假设是VALUE
值在组内是唯一的。)
最后,您希望获得每level1
WITH partitioned AS (
SELECT
*,
max_year_month = MAX(year_month) OVER (PARTITION BY level1, level2, level3, level4, level5),
max_moddate = MAX(moddate ) OVER (PARTITION BY level1, level2, level3, level4, level5, year_month)
FROM dbo.atable
)
SELECT
level1,
total = SUM(VALUE)
FROM partitioned
WHERE year_month = max_year_month
AND moddate = max_moddate
GROUP BY
level1
;
提取值的总和。
MAX
基本上,此查询使用窗口聚合函数{{1}}来查找每个组的最新行和每个相应超级组的最新组。然后,它使用这些结果来过滤数据集,其余的只是简单的分组和聚合。