我正在使用試圖查詢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
此查詢使完全相同的表上的整個子查詢。這是必要的嗎?如果不是,這裏最好的做法是什麼?
謝謝!
我看不出你能做得更好。除非你可以保存子視圖。不知道hadoop是否可以做到這一點。 – durbnpoisn