2015-04-28 2 views
2

Я пытаюсь создать HIVE query от Oracle SQL query. По сути, я хочу выбрать первую запись, отсортированную descending по UPDATED_TM, DATETIME, ID_NUM.SQL QUALIFY эквивалентный запрос HIVE

SELECT 
    tbl1.NUM AS ID, 
    tbl1.UNIT AS UNIT, 
    tbl2.VALUE AS VALUE, 
    tbl1.CONTACT AS CONTACT_NAME, 
    'FILE' AS SOURCE, 
    CURDATE() AS DATE 
FROM 
    DB1.TBL1 tbl1 
    LEFT JOIN DB1.TBL2 tbl2 ON tbl1.USR_ID = tbl2.USR_ID 
WHERE 
    tbl1.UNIT IS NOT NULL 
    AND tbl1.TYPE = 'Generic' 
QUALIFY 
    ROW_NUMBER() OVER (PARTITION BY tbl1.ROW_ID ORDER BY tbl1.UPDATED_TM DESC, tbl1.DATETIME DESC, tbl1.ID_NUM DESC) = 1 

И моя попытка эквивалент Hive query (но и SQL-совместимый):

SELECT 
    tbl1.NUM AS ID, 
    tbl1.UNIT AS UNIT, 
    tbl2.VALUE AS VALUE, 
    tbl1.CONTACT AS CONTACT_NAME, 
    'FILE' AS SOURCE, 
    CURDATE() AS DATE 
FROM (
    SELECT 
    USR_ID, TYPE, NUM, UNIT, ROW_NUMBER() OVER (PARTITION BY tbl1.ROW_ID ORDER BY tbl1.UPDATED_TM DESC, tbl1.DATETIME DESC, tbl1.ID_NUM DESC) AS RNUM 
    FROM 
    DB1.TBL1 
) tbl1 
    LEFT JOIN DB1.TBL2 tbl2 ON tbl1.USR_ID = tbl2.USR_ID 
WHERE 
    tbl1.RNUM = 1 
    AND tbl1.UNIT IS NOT NULL 
    AND tbl1.TYPE = 'Generic' 

ли это, кажется правильным? Есть ли способ оптимизировать запрос? Таблицы, с которыми я работаю, довольно большие, и я хотел бы сделать это максимально эффективным.

Спасибо.

ответ

2
SELECT 
    tbl1.NUM AS ID, 
    tbl1.UNIT AS UNIT, 
    tbl2.VALUE AS VALUE, 
    tbl1.CONTACT AS CONTACT_NAME, 
    'FILE' AS SOURCE, 
    CURDATE() AS DATE 
FROM 
(
SELECT 
    USR_ID, TYPE, NUM, UNIT, ROW_NUMBER() OVER (PARTITION BY tbl.ROW_ID ORDER BY tbl.UPDATED_TM DESC, tbl.DATETIME DESC, tbl.ID_NUM DESC) AS RNUM 
FROM 
    (
     SELECT 
       USR_ID,TYPE,NUM,UNIT,ROW_ID,UPDATED_TM,DATETIME,ID_NUM 
      FROM DB1.TBL1 
     WHERE UNIT IS NOT NULL 
     AND TYPE = 'Generic' 
    )tbl 
)tbl1 
LEFT OUTER JOIN 
DB1.TBL2 tbl2 
ON tbl1.USR_ID = tbl2.USR_ID 
WHERE tbl1.RNUM = 1; 
+0

Спасибо! Это сделал трюк. –

+1

@Ubobo: Нет необходимости в двойной вложенности. Вы можете комбинировать внутренний самый SELECT с средним уровнем (таким образом, фильтруя на 'UNIT' и' TYPE' и получая номера строк на одном уровне). –

Смежные вопросы