SQL查询按范围分组
Posted
技术标签:
【中文标题】SQL查询按范围分组【英文标题】:SQL query grouping by range 【发布时间】:2020-09-24 07:16:49 【问题描述】:您好,有一个表 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 |
+---------+---------+--------+
我的数据库是 DB2/400。 我已经尝试使用 ROW_NUMBER 分区、子查询,但我不知道如何解决这个问题。
【问题讨论】:
【参考方案1】:我将此理解为间隙和孤岛问题,您希望将具有相同 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
【讨论】:
非常感谢您的帮助,您的回答解决了我的问题。【参考方案2】:你可以试试下面的-
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
【讨论】:
【参考方案3】:这在 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。你按 PA 分组和你所做的分组,rn,得到了 froups,然后 Bob 是你的叔叔。
【讨论】:
以上是关于SQL查询按范围分组的主要内容,如果未能解决你的问题,请参考以下文章