簡體   English   中英

GROUP BY指定的行數

[英]GROUP BY specified number of rows

我有一個總是按日期排序的數據表。 我想將1萬個LAST行乘以1000進行分組。如果我說15200個行,則10個組應由5201-6200、6201-7200,...,13201-14200和14201-15200行組成。 表中的行未計算。 我需要它來查找10組中每組的值總和

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

您可以使用內聯視圖和用戶定義的變量來模擬ROW_NUMBER分析函數,然后使用“ ROW”對表達式進行“分組”,該表達式使用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初始化一個MySQL用戶定義的變量@rn 。我們實際上並不關心該查詢返回的內容,只是由於JOIN操作,我們需要查詢僅返回一行;我們真正關心的是about是在語句的其余部分運行之前初始化用戶定義的變量。

在處理每一行時,@rn加1,並且當前值作為結果集中的“行號”列(分配給rn的別名)返回。

(注意:我們選擇將@rn初始化為-1而不是0,以便返回rn列時以0開頭的值。比以后將rn值以1開頭的情況更方便。使用整數除法將其分為1000個組。)

ORDER BY子句是可選的; 但是如果有一個特定的“順序”可用來確定哪10,000行是“最后”行,則可以在ORDER BY子句中指定。 (我在這里指定了quantity列,因為那是我在表中知道的唯一一列...我沒有任何有關標識行是在其他行之前還是之后的信息。)

LIMIT子句限制返回的行數,因此我們只能得到10,000行。 無論指定什么內容,這都是查詢返回的“第一” 10,000行。 (要獲得相反的行,以便首先返回“最后”行,請將DESC關鍵字添加到ORDER BY子句中。)

外部查詢上的GROUP BY使用“整數除法”運算符。 使用該表達式, rn值0到999計算為0,rn值1000到1999計算為1,依此類推。

您可以只運行內聯視圖查詢,以查看如何分配行號。

您可以在外部查詢的SELECT列表中添加其他表達式,以演示該語句的工作方式,例如

SELECT SUM(v.quantity)    AS sum_quantity
     , SUM(1)             AS row_count
     , MIN(v.rn)          AS rn_min
     , MAX(v.rn)          AS rn_max
     , MAX(v.rn) DIV 1000 AS rn_div_1000

第一:如何獲得最后的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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM