如何求某個分組裡面的最小時間點對應的那條記錄

2021-06-22 16:57:25 字數 727 閱讀 7740

前段時間遇到乙個需求是在一批資料裡邊,按照分組分別求最小時間字段對應的記錄,因為剛看了row_number的函式介紹,就用了此函式,先用乙個子查詢,對資料分組,根據時間排序,得到每行的行號,然後求出行號是1的所有資料。具體為select * from (select a,b,c,row_number() over(distribute by a sort by time) rn 

from table) x where rn=1; 此任務一直執行的正常沒出什麼問題,結果某個特殊的活動日,資料量激增,在reduce階段記憶體溢位。因為排序會將符合某個a值的記錄全部分到同乙個reduce節點,就注定了這是無法通過增加reduce個數來改變的,而整個分布式集群的記憶體是有限的,每個節點能夠使用的記憶體也是被限制的,不可能無限增加記憶體,所以就考慮改寫sql,避開這種情況。其實當時在用row_number之前就曾考慮的做法是先做乙個新錶求出每組的最小時間,然後拿原表與新錶join,就可以得到最小值對應的記錄。此做法有兩個問題:1)不夠高大上 2)如果有多條記錄都符合最小值條件,就沒法拿到唯一記錄。所以當時選了row_number.

而當資料量激增,面臨問題後,又重新考慮原來的方法,唯一需要解決的問題就是第2點,而這一條恰好可以通過row_number解決,所以,我選擇了結合兩種方法一起解決此問題,首先求最小值,再與原表join,得到的記錄有重複值,就用row_number再重新排序一次,因為此時的資料量已經很小,而且只有特殊的組有重覆記錄,重覆記錄也不會特別多,也就不會發生reduce節點記憶體溢位的問題。

對ArrayList按照某個屬性進行分組

概述 通常使用sql查詢一批資料的時候,可以利用sql中的group by語句對資料進行分組,但是有時候出於對效能的考慮,不會使用group by,而是先把資料撈出來後,使用 在記憶體中按照某個屬性進行分組。public class skuvo public long getskuid public...

MySQL分組排序求Top

這篇文章主要介紹了詳解mysql分組排序求top 表結構 create table score id int 11 not null auto increment,grp int 11 default null,num int 11 default null,primary key id engin...

mysql分組求topN詳解

create table test1 id int 11 not null auto increment,name varchar 20 default null,course varchar 20 default null,score int 11 default null,primary key...