【问题标题】:Grouping a concrete number of rows in a SQL query在 SQL 查询中对具体数量的行进行分组
【发布时间】:2013-12-04 08:55:57
【问题描述】:

我想在没有任何特定标准的情况下对数据进行分组,只是每个结果组的数据数量。我有一张这样的桌子:

DATE              VAL1      VAL2
------------    ------    ------
01-01-2013           5         8
01-02-2013          14        23
01-03-2013          10         6
01-04-2013          21        88
01-05-2013           9        11
01-06-2013           4         9
01-07-2013          19        42
01-08-2013           8         4
01-09-2013          12         1
01-10-2013           2         8
01-11-2013          31        65
01-12-2013           3         6
...

例如,认为日期字段可能是数字而不是日期...

例如,我想要的是获取数据组的总和或平均值,其中组具有特定的行数(所有组的行数相同)。

例如,对于每组三行,我想得到 VAL1 的总和和 VAL2 的平均值:

INTERVAL                  SUM VAL 1   AVG VAL 2
-----------------------   ---------   ---------
01-01-2013 - 01-03-2013          29        12.3
01-04-2013 - 01-06-2013          34        33.3
01-07-2013 - 01-09-2013          39        15.6
01-10-2013 - 01-12-2013          36        26.3
...

我真的认为可以通过查询来完成,但我找不到获得正确“分组依据”句子的方法。有人可以帮帮我吗?

提前非常感谢!

【问题讨论】:

    标签: sql oracle grouping row-number


    【解决方案1】:

    您可以使用 row_number 函数除以 3 为每组 3 个连续行分配唯一编号。然后,您可以在此组号上进行聚合。

    select min("DATE") ||'-'||max("DATE"),
           sum(val1),
           avg(val2)
    from (
          select "DATE", val1, val2,
                 ceil(row_number() over (order by "date") / 3) as grp
          from mytab
        ) as x
    group by grp
    order by grp;
    

    【讨论】:

      【解决方案2】:

      请尝试:

      select  
        min("DATE")||' - '||max("DATE") "Interval",
        sum(Val1) "SUM VAL 1", 
        cast(avg(Val2) as numeric(18,1)) "AVG VAL 2"
      from(
        select 
          "DATE",
          ceil(extract(month from "DATE")/3) dt,
          Val1,
          Val2
        from 
          YourTable 
      )x 
       group by dt 
       order by dt
      

      SQL Fiddle Demo

      【讨论】:

        【解决方案3】:

        oracle中的ROWNUM伪列或者mysql的LIMIT可以帮你实现。

        我认为你的意思是分页。在此链接中给出。 http://www.oracle.com/technetwork/issue-archive/2006/06-sep/o56asktom-086197.html

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-27
          • 1970-01-01
          • 2016-09-27
          • 1970-01-01
          • 1970-01-01
          • 2021-01-23
          相关资源
          最近更新 更多