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查询按范围分组的主要内容,如果未能解决你的问题,请参考以下文章

SQL查询将连续范围的数字分组到不同的分组集中

SQL递归查询知多少

使用按日期分组的 sql 查询

sql多条件分组查询,求sql语句。

按时间序列分组的 SQL 查询

SQL查询按整数值分组