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'
ли это, кажется правильным? Есть ли способ оптимизировать запрос? Таблицы, с которыми я работаю, довольно большие, и я хотел бы сделать это максимально эффективным.
Спасибо.
Спасибо! Это сделал трюк. –
@Ubobo: Нет необходимости в двойной вложенности. Вы можете комбинировать внутренний самый SELECT с средним уровнем (таким образом, фильтруя на 'UNIT' и' TYPE' и получая номера строк на одном уровне). –