1. 程式人生 > >使用Kettle 對記錄排序並取前面n條記錄的方法

使用Kettle 對記錄排序並取前面n條記錄的方法

2.1:測試資料準備工作

-- 建立表
CREATE TABLE `tmallorder` (
  `datekey` INT(11) NOT NULL,-- 日期
  `storename` VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, -- 店鋪名稱
  `goodsname` VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, -- 商品名稱
  `goodsmoney` DECIMAL(20,4) DEFAULT NULL -- 銷售額
) ENGINE=INNODB DEFAULT CHARSET=utf8
-- 插入測試資料
INSERT INTO tmallorder(datekey,storename,goodsname,goodsmoney)
VALUES(20121111,'GXG旗艦店','GXG黑色呢絨大衣20121111G1',985231455.80)
INSERT INTO tmallorder(datekey,storename,goodsname,goodsmoney)
VALUES(20121111,'GXG旗艦店','GXG黑色呢絨大衣20121111G2',882373145.48)
INSERT INTO tmallorder(datekey,storename,goodsname,goodsmoney)
VALUES(20121111,'太平鳥旗艦店','太平鳥黑色呢絨大衣20121111T1',100025863.80)
INSERT INTO tmallorder(datekey,storename,goodsname,goodsmoney)
VALUES(20121111,'太平鳥旗艦店','太平鳥黑色呢絨大衣20121111T3',1126988817.48)
INSERT INTO tmallorder(datekey,storename,goodsname,goodsmoney)
VALUES(20121112,'GXG旗艦店','GXG黑色呢絨大衣20121111G1',2585231455.80)
INSERT INTO tmallorder(datekey,storename,goodsname,goodsmoney)
VALUES(20121112,'GXG旗艦店','GXG黑色呢絨大衣20121111G2',1585231455.80)
INSERT INTO tmallorder(datekey,storename,goodsname,goodsmoney)
VALUES(20121112,'太平鳥旗艦店','太平鳥黑色呢絨大衣20121111T1',300025863.80)
INSERT INTO tmallorder(datekey,storename,goodsname,goodsmoney)
VALUES(20121112,'太平鳥旗艦店','太平鳥黑色呢絨大衣20121111T2',170025863.80)

--最終的統計結果

日期          店鋪          商品名稱                              銷售額

20121111 GXG旗艦店 GXG黑色呢絨大衣20121111G1 985231455.8000
20121111 GXG旗艦店 GXG黑色呢絨大衣20121111G2 882373145.4800
20121111 太平鳥旗艦店 太平鳥黑色呢絨大衣20121111T1 100025863.8000
20121111 太平鳥旗艦店 太平鳥黑色呢絨大衣20121111T2 126988817.4800
20121111 太平鳥旗艦店 太平鳥黑色呢絨大衣20121111T3 1126988817.4800
20121112 GXG旗艦店 GXG黑色呢絨大衣20121111G1 2585231455.8000
20121112 GXG旗艦店 GXG黑色呢絨大衣20121111G2 1585231455.8000
20121112 太平鳥旗艦店 太平鳥黑色呢絨大衣20121111T1 300025863.8000
20121112 太平鳥旗艦店 太平鳥黑色呢絨大衣20121111T2 170025863.8000

2.2: 針對所有記錄排序取top n,不分組取top n

元件:sortrows+js

 2.2.1:

tmallorder就是測試表資料的一個輸出,sort rows 就是先針對記錄做一個排序,針對業務需求選擇是降序或者是升序,本例是取交易額大的所以排序指標是降序

排序欄位為1個 交易額 ASC 為N即為降序排序。

2.2.2:

trans_Status = CONTINUE_TRANSFORMATION;
if(getProcessCount("r")>3) {
 trans_Status = SKIP_TRANSFORMATION;
}

SKIP_TRANSFORMATION , ERROR_TRANSFORMATION, CONTINUE_TRANSFORMATION是TRANSFORMATION已經預先定義好的靜態常量,不可更改。 作用是   過濾記錄行,控制轉換流程

例如:

trans_Status = CONTINUE_TRANSFORMATION

if (field.getString()==’123’) trans_Status = SKIP_TRANSFORMATION

getProcessCount("")方法在kettle是一個特殊的函式,含義和引數解釋spoon官方解釋:

// Returns a number with the current processed Rows.
// The type is changable.
//
// Usage:
// getProcessCount(var);
// 1: String - The Pentaho/Kettle Type:
// u - Lines Update
// i - Lines Insert
// w - Lines Write
// r - Lines Read
// o - Lines Output

JS後面的操作就是輸出處理後的資料了,我們可以看一下結果,如下圖。

在TEST的所有結果集裡面取交易額top3記錄,我們看前面的表資料可以看出處理結果是正確的。

2.3: 針對所有記錄排序取top n,分組取top n 即在每天都取出top N

元件:sort rows+group by+Filter rows

2.3.1:因為是分組排序取top n,所以在分組之前排序的時候除了top n的標準欄位金額之外,就是還要加上要分組的欄位,如下圖:

goodsmoney就是top的標準按照金額最大取top 分組欄位為datekey日期。

2.3.2:說到分組排序就要說分組了 這裡我們就用到了我們日常經常使用的group by元件如下圖,打鉤的地方勾上。Add line number處給一個欄位,名字自定

此處我設定的是rownunber,分組欄位就是分組取top的欄位比如每天,每個店鋪都可以。rownumber 會作為下一步的一個新增欄位。

2.3.3:最後一步就是要用到過濾(Filter rows)上一步的rownumber其實就是分組排序後的每一個排名欄位。我們取top3,

即為rownumber<4的所有資料

如下圖:

最終結果為:

和測試表結果對比後,我們可以發現11號和12號兩天的資料分別取top3是正確的。

2.4: 針對kettle分組排序取topn 的總結:

        其實規則都一樣,如果再往下擴充套件,取每天每個店鋪的top2我們就可以在sort rows 和group by 中新增指標即可,過濾的操作不變,就是topn 中N的值。

        取每天每個店鋪的top2:具體的就不再多說了,看步驟:

step1:    top指標還是交易額欄位,group by 為日期 店鋪

 step2:group by 為日期 店鋪 新增排序標示

step3:取top2  rownumber<3

step 4:預覽處理結果:

和表中資料對比後可發現,11和12號兩天中,GXG和太平鳥兩個店鋪銷售額前2的商品資料是正確的。

 總結:無論是哪一種ETL ,工具其實都是有它的優點和缺點的。利用好他們的優點,想辦法解決他們的缺點,會給我們的工作帶來輕鬆和愉快,謝謝大家。

相關推薦

使用Kettle 記錄排序前面n記錄方法

2.1:測試資料準備工作 -- 建立表 CREATE TABLE `tmallorder` (   `datekey` INT(11) NOT NULL,-- 日期   `storename` VARCHAR(50) CHARACTER SET utf8 COLLATE u

Mysql分組統計、排序N記錄解決方案

今日根據專案需求,需要在mysql中解決記錄的分組統計、排序,並抽取前10條記錄的功能。現已解決,解決方案如下: 1)表結構 <span style="font-size:18px;">CREATE TABLE `policy_keywords_rel` (

Linq分組及排序N記錄

Linq多欄位分組排序並取前N條記錄時,一定要先分組再排序,不然取到的記錄是不規則的 程式碼示例【按HotWord分組,並取sorNum倒序,取前15條記錄】 [Route("api/

【MySQL】多表查詢、分組求和、排序top n

查漏補缺MySQL的相關知識 1. 有一個使用者資金流水錶(如上的sql程式碼),找出流水金額最多的前10個使用者: 2. 查詢分組後的最大值,最小值所在的整行記錄或者分組後的top n行的記錄。 3.TOP 1 4.TOP N

mysql使用GROUP BY分組實現N記錄方法

cls class ges rom 當前 分組 實現 一個 images MySQL中GROUP BY分組取前N條記錄實現 mysql分組,取記錄 GROUP BY之後如何取每組的前兩位下面我來講述mysql中GROUP BY分組取前N條記錄實現方法。 這是測試表(也

sql語句分組查詢排序後取出前n記錄

1.sql語句分組排序後取出前n條記錄 (SELECT * FROM ( SELECT "row_number" () OVER ( PARTITION BY mmsi ORDER BY orginal_in_draught DESC ) A

mysql學生成績排名,分組N 記錄

score表: CREATE TABLE `score` ( `student_id` int(10) DEFAULT NULL, `class_id` int(10) DEFAULT NULL, `score` int(5) DEFAULT

es java 聚合方法——聚合後根據count排序前2資料

聚合後根據count排序並取前2條資料 /** * 聚合後根據count排序並取前2條資料 */ @Test public void orderAfterAggregation(){ SearchResp

mysql 分組排序 N全部記錄 同時存在條件篩選

1.首先利用條件篩選出基本資料SELECT * from test where columna = 'xxx' AND columnb = 'xxx' and ......2.對基本資料分組並利用SUB

排序後的結果集中刪除 前n記錄

not null ima -- date com alt delet lec log 端午有人休息,有人忙 操作前數據: --從排序後的結果集中刪除 前n條記錄delete from emp where empno in (select empno

[SQL]每個使用者最近一記錄(分組Top n

一直沒有時間寫分享,終於等到雙十一,任何需求都不準上,這才抽出時間整理一下蒐集了好幾天的SQL。 需求:查出使用者最近一條登入記錄。(110w條) 前提:預設時間和id都是遞增。(求時間最大->求id最大) 第一種:select * from user_log

程式實現資料排序按出現次數進行排序 程式實現資料排序按出現次數進行排序(注:用面向物件的方式實現,用for迴圈進行排序,別用comparable介面實現){1,4,2,1,3,2,1,4}作為

程式實現對資料排序並按出現次數進行排序 程式實現對資料排序並按出現次數進行排序(注:用面向物件的方式實現,用for迴圈進行排序,別用comparable介面實現){1,4,2,1,3,2,1,4}作為引數(引數可變)傳入java方法中,控制檯輸出以下結果 1出現了3次 2出現了2次

程式實現資料排序按出現次數進行排序 目錄 1. 題目程式實現資料排序按出現次數進行排序 1 2. 思路 2 3. 效果 2 4. 程式碼 /00listPrj/src/Sort.java 2

程式實現對資料排序並按出現次數進行排序   目錄 1. 題目程式實現對資料排序並按出現次數進行排序 1 2. 思路 2 3. 效果 2 4. 程式碼 /00listPrj/src/Sort.java 2     題目

jdk1.8-map根據value排序n位(及簡)

public static void main(String[] args) { Map<String,Integer> mapRepeat = new HashMap<>(); mapRepeat.put("aa", 1);

parttion by ~~~針對某個欄位或多個欄位重複,資料只n。問題例子:1.主評論下的評論按著 時間正序最多隻前5 2.獲取最新登入記錄......

分組目前已知partition by、group by partition by用於給結果集分組分割槽,如果沒有指定那麼它把整個結果集作為一個分組,最後顯示具體資料 group by:通過所查詢的資料的某一欄位或屬性進行分組,最後顯示組資料,而不是具體資料,因為select 後面的所有列中,沒有使用聚合函

MySQL每組的前N記錄

  MySQL 分組後取每組前N條資料 與oracle的 rownumber() over(partition by xxx  order by xxx )語句類似,即:對錶分組後排序 CREATE TABLE `mygoods` ( `goods

用postgresql特性簡化group by 後每組前n記錄方法

需求: 求一段時間內各生產線前3名壞機的原因及壞機數. step 1, 從將原始資料中抽取品質資料放於t96臨時表 create temp table t96 on commit drop as

Mysql和Oracl 分組每組前N記錄

MySQL取每組的前N條記錄:使用自連線的方式一、對分組的記錄取前N條記錄:例子:取前 2條最大(小)的記錄1234567891011121314151617181.用子查詢:SELECT * FROM right2 a  WHERE 2>(SELECT COUNT(*

分組查詢每組前n記錄例項

假設有這樣一張運動員比賽成績表 tb_score 現在要求查詢出每個國家的前三名的成績記錄,查詢語句可以這樣寫: 1、 select t3.id,t3.country,t3.score fro

mysql 每個分類下的N記錄

第一種方式 SELECT * FROM tablename AS a WHERE (SELECT COUNT(*) FROM tablename AS b WHERE