2016-04-25 21 views
0

我想加入這些關於id和playerID以及year和yearID(下面的模式)的select語句。同樣減去別名HAB-EG在兩個選擇語句中也按年份和id分組,以便在稍後的層次結構中執行分割和減法之前對值進行求和。它說,由G組合,當我嘗試這個,似乎很奇怪。我不需要通過G,只是ID和年級組,因爲玩家可以在表中的多個條目,我們需要將G,EH和AB總結計算之前HIVE多組加減運算

Try this: 

SELECT 
    a.playerID AS ID, 
    a.yearID AS yearID, 
    (b.HAB - a.EG) AS `HAB-EG` 
FROM 
    (SELECT 
     SUM(playerID), 
     SUM(yearID), 
     (E/G) AS EG 
    FROM fielding 
    WHERE (
      yearID > 2005 
      AND yearID < 2009 
      AND G > 20 
      )GROUP BY playerID,yearID 
    ) AS a 
JOIN 
    (SELECT 
     SUM(id), 
     SUM(year), 
     (hits/ab) AS HAB 
    FROM batting 
    WHERE( 
      year > 2005 
      AND year < 2009 
      AND ab > 40 
      ) GROUP BY id,year 

    ) AS b ON a.playerID = b.id AND a.yearID = b.year; 

JUST SCHEMA

CREATE EXTERNAL TABLE IF NOT EXISTS fielding 
(playerID STRING ,yearID INT ,teamID STRING ,lgID STRING , 
POS STRING ,G INT ,GS INT , InnOuts INT , PO INT,A INT, E INT, 
DP INT , PB INT , WP INT ,SB INT ,CS INT , ZR INT) ROW 
FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION  '/home/hduser/hivetest/fielding'; 

JUST架構

CREATE EXTERNAL TABLE IF NOT EXISTS batting(id STRING, year INT, team STRING, 
league STRING, games INT, ab INT, runs INT, hits INT, doubles INT, triples 
INT, homeruns INT, rbi INT, sb INT, cs INT, walks INT, strikeouts INT, ibb 
INT, hbp INT, sh INT, sf INT, gidp INT) ROW FORMAT DELIMITED FIELDS 
TERMINATED BY ',' LOCATION '/home/hduser/hivetest/batting'; 
+1

似乎你的分組已關閉。您有興趣按非聚合值進行分組。例如。 'SELECT id,sum(value)GROUP BY id'。 – ssn

+1

..還有 - 爲什麼你想按年份分組?你是在每個玩家每年獲得比率之後,還是僅僅是每個玩家? – ssn

+0

Ahhhh abs right ...這樣的公然錯誤我的部分 – dedpo

回答

0

試試這個:

SELECT 
    a.playerID AS ID, 
    a.yearID AS yearID, 
    (b.HAB - a.EG) AS `HAB-EG` 
FROM 
    (SELECT 
     playerID, 
     yearID, 
     (SUM(E)/SUM(G)) AS EG 
    FROM fielding 
    WHERE (
      yearID > 2005 
      AND yearID < 2009 
      AND G > 20 
      )GROUP BY playerID,yearID 
    ) AS a 
JOIN 
    (SELECT 
     id, 
     year, 
     (SUM(hits)/SUM(ab)) AS HAB 
    FROM batting 
    WHERE( 
      year > 2005 
      AND year < 2009 
      AND ab > 40 
      ) GROUP BY id,year 

    ) AS b ON a.playerID = b.id AND a.yearID = b.year;