2016-06-23 40 views
3

我正在使用試圖查詢Hadoop的HiveQL。我的問題是這樣的。SQL:追加本月的記錄數作爲列/字段

比方說,我有一個查詢(和結果表)是這樣的:

SELECT CustomerID, PurchaseID, DateOfPurchase 
FROM MyTableName; 

+------------+------------+----------------+ 
| CustomerID | PurchaseID | DateOfPurchase | 
+------------+------------+----------------+ 
|  101 |  501 | 2014-01-01  | 
|  101 |  502 | 2014-01-15  | 
|  101 |  503 | 2014-01-20  | 
|  101 |  504 | 2015-01-19  | 
|  101 |  505 | 2015-08-25  | 
|  102 |  506 | 2014-01-02  | 
|  102 |  507 | 2014-01-03  | 
|  103 |  508 | 2016-05-05  | 
+------------+------------+----------------+ 

我想補充一點,表示訂單的客戶已經每月發的數量,在每個日期對應的另一列行。這裏是我的結果表的想法:

+------------+------------+----------------+--------------------+ 
| CustomerID | PurchaseID | DateOfPurchase | PurchasesThisMonth | 
+------------+------------+----------------+--------------------+ 
|  101 |  501 | 2014-01-01  |     3 | 
|  101 |  502 | 2014-01-15  |     3 | 
|  101 |  503 | 2014-01-20  |     3 | 
|  101 |  504 | 2015-01-19  |     1 | 
|  101 |  505 | 2015-08-25  |     1 | 
|  102 |  506 | 2014-01-02  |     2 | 
|  102 |  507 | 2014-01-03  |     2 | 
|  103 |  508 | 2016-05-05  |     1 | 
+------------+------------+----------------+--------------------+ 

也就是說,對於每一行,PurchasesThisMonth列表示多少採購是由當月客戶做。客戶101在2014年1月進行了3次購買,因此2014年1月的每個行在PurchasesThisMonth中有3個。

我能夠在同一個表上的子查詢上使用INNER JOIN獲得此功能。但考慮到我的數據集相當大,這需要很長時間。但是,有沒有更好/更快的方式來做到這一點?

這是我解決它的暴力方式。

SELECT CustomerID, PurchaseID, DateOfPurchase, Sub.PurchasesThisMonth 
FROM MyTableName 
INNER JOIN (
    SELECT 
    CustomerID, 
    COUNT(Inner.PurchaseID) as PurchasesThisMonth 
    MONTH(Inner.DateOfPurchase) as month, 
    YEAR(Inner.DateOfPurchase) as year 

    FROM MyTableName Inner 
    GROUP BY Inner.CustomerID, 
      MONTH(Inner.DateOfPurchase), 
      YEAR(Inner.DateOfPurchase) 
) Sub 
ON CustomerID=Sub.CustomerID AND 
    MONTH(DateOfPurchase)=Sub.month AND 
    YEAR(DateOfPurchase)=Sub.year 

此查詢使完全相同的表上的整個子查詢。這是必要的嗎?如果不是,這裏最好的做法是什麼?

謝謝!

+0

我看不出你能做得更好。除非你可以保存子視圖。不知道hadoop是否可以做到這一點。 – durbnpoisn

回答

1

我想你可以使用窗口函數count() over()

SELECT CustomerID, PurchaseID, DateOfPurchase 
,count(*) over(partition by 
       customerid, 
       MONTH(DateOfPurchase), 
       YEAR(DateOfPurchase) order by customerid) 
FROM MyTableName; 
+0

這減少了我的查詢花費巨大的時間。謝謝! –