GROUP BY指定的行数

时间:2014-07-09 14:36:24

标签: mysql sql

我有一个数据表,总是按日期排序。我想分组说10 000 LAST行乘以1 000.如果我说15200行,10组应该包括行5201-6200,6201-7200,...,13201-14200,14201-15200。表中的行不是计算的。我需要这个来找到10组中每一组的值总和

SELECT SUM(quantity)
FROM dataTable
GROUP BY ???

2 个答案:

答案 0 :(得分:1)

您可以使用内联视图和用户定义的变量来模拟ROW_NUMBER分析函数,然后" group by"一个表达式,它使用ROW_NUMBER为每个"组导出一个公共值"行。

像这样的东西,例如:

SELECT SUM(v.quantity) AS sum_quantity
  FROM (
         SELECT d.quantity
              , @rn := @rn + 1 AS rn
           FROM dataTable d
          CROSS
           JOIN (SELECT @rn := -1) i
          ORDER BY d.quantity
          LIMIT 10000
       ) v
 GROUP BY v.rn DIV 1000

内联视图(分配了v的别名)指定了一个"行号"从dataTable到每一行。 (内联视图别名为i初始化 @rn ,这是一个MySQL用户定义的变量。我们并不关心查询返回的内容,除非我们需要由于JOIN操作,查询只返回一行;我们真正关心的是在语句的其余部分运行之前初始化用户定义的变量。

在处理每一行时,@ rn增加1,当前值返回为"行号"列(在结果集中分配了 rn 的别名)。

(注意:我们选择将@rn初始化为-1而不是0,以便返回rn列,其值从0开始。这比开始{{1}更方便值为1,当我们稍后"使用整数除法运算将行"行组成1000组。)

rn子句是可选的;但如果有特定的"顺序"通过它您可以确定哪些10,000行是"最后一行"在行中,您可以在ORDER BY子句中指定它。 (我在这里指定了ORDER BY列,因为这是我在表格中知道的唯一一栏......我没有任何关于识别行是否是"之前"或"之后"其他一些行。)

quantity子句限制返回的行数,因此我们只获得10,000行。这将是"第一"无论指定什么,查询返回10,000行。 (要以相反的顺序获取行,请首先返回" last"行,将LIMIT关键字添加到ORDER BY子句中。)

外部查询的DESC使用"整数除法"运营商。使用该表达式,GROUP BY值0到999评估为0,值1000到1999年评估为1,等等。

您可以只运行内联视图查询,以查看如何分配行号。

您可以在外部查询的SELECT列表中添加其他表达式,以演示语句的工作方式,例如

rn

答案 1 :(得分:0)

首先:如何获取最后10000行?按日期排序并在第10000行之后剪切。

select quantity
from datatable
order by thedate desc
limit 10000;

那么如何创建可以与其一起构建组的行号?将结果与递增变量交叉连接。 (这里我必须依赖于MySQL在排序行之后递增变量的事实。这不是保证行为。事实上,我在文档中找不到任何相关内容。也许他们保证这一天,因为许多人已经依赖这种行为。)

select @rownum := @rownum + 1 as rn, q.quantity
from
(
  select quantity, thedate
  from datatable
  order by thedate desc
  limit 10000
) q
cross join (select @rownum := 0) r
order by thedate desc;

在最后的构建组中,将行号除以1000:

select truncate( (rn-1) / 1000, 0 ) as groupno, sum(quantity)
from
(
  select @rownum := @rownum + 1 as rn, q.quantity
  from
  (
    select quantity, thedate
    from datatable
    order by thedate desc
    limit 10000
  ) q
  cross join (select @rownum := 0) r
  order by thedate desc
)
group by groupno;