如何解决SQL查询按范围分组
您好,表A中包含以下数据:
+------+-------+----+--------+
| YEAR | MONTH | PA | AMOUNT |
+------+-------+----+--------+
| 2020 | 1 | N | 100 |
+------+-------+----+--------+
| 2020 | 2 | N | 100 |
+------+-------+----+--------+
| 2020 | 3 | O | 100 |
+------+-------+----+--------+
| 2020 | 4 | N | 100 |
+------+-------+----+--------+
| 2020 | 5 | N | 100 |
+------+-------+----+--------+
| 2020 | 6 | O | 100 |
+------+-------+----+--------+
我希望得到以下结果:
+---------+---------+--------+
| FROM | TO | AMOUNT |
+---------+---------+--------+
| 2020-01 | 2020-02 | 200 |
+---------+---------+--------+
| 2020-03 | 2020-03 | 100 |
+---------+---------+--------+
| 2020-04 | 2020-05 | 200 |
+---------+---------+--------+
| 2020-06 | 2020-06 | 100 |
+---------+---------+--------+
我的DB是DB2 / 400。 我已经尝试了ROW_NUMBER分区和子查询,但是我不知道如何解决这个问题。
解决方法
我认为这是一个“空白与孤岛”问题,您希望将PA
相同的相邻行组合在一起。
这是一种利用行号之间的差异来构建组的方法:
select min(year_month) year_month_start,max(year_month) year_month_end,sum(amount) amount
from (
select a.*,year * 100 + month year_month
row_number() over(order by year,month) rn1,row_number() over(partition by pa order by year,month) rn2
from a
) a
group by rn1 - rn2
order by year_month_start
,
您可以尝试以下-
select min(year)||'-'||min(month) as from_date,max(year)||'-'||max(month) as to_date,sum(amount) as amount from
(
select *,row_number() over(order by month)-
row_number() over(partition by pa order by month) as grprn
from t1
)A group by grprn,pa order by grprn
,
这在tsql中有效,您猜您可以将其修改为db2-400吗?
SELECT MIN(Dte) [From],MAX(Dte) [To]
--,PA,SUM(Amount)
FROM (
SELECT year * 100 + month Dte,Pa,Amount,ROW_NUMBER() OVER (PARTITION BY pa ORDER BY year * 100 + month) +
10000- (YEar*100+Month) rn
FROM tabA a
) b
GROUP BY Pa,rn
ORDER BY [From],[To]
诀窍是行号函数按PA划分并按日期排序,这将为每个月加一,将月和月的递减计数相加后,您将获得连续几个月的相同数字具有相同的功率放大器。您是由PA组成的小组,是您进行分组的,所以得到了面包,然后鲍勃是您的叔叔。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。