要在您的系統上試用的代碼和示例資料:
CREATE TABLE "EMP"
( "DR_SID" NUMBER,
"DR_NAME" VARCHAR2(50 BYTE) COLLATE "USING_NLS_COMP",
"ACTIVE_FLAG" VARCHAR2(1 BYTE) COLLATE "USING_NLS_COMP",
"LAST_UPDATED_TIME" TIMESTAMP (6),
"DATA_SOURCE" VARCHAR2(100 BYTE) COLLATE "USING_NLS_COMP",
"ROW_LIMIT" VARCHAR2(50 BYTE) COLLATE "USING_NLS_COMP",
"VERSION#" NUMBER,
"PARENT_DR_SID" NUMBER
)
;
REM INSERTING into EMP
SET DEFINE OFF;
Insert into EMP (DR_SID,DR_NAME,LAST_UPDATED_TIME,VERSION#,PARENT_DR_SID) values (1,'this should not come1',to_timestamp('18-APR-20 05.05.52.425734000 AM','DD-MON-RR HH.MI.SSXFF AM'),1,1);
Insert into EMP (DR_SID,DR_NAME,LAST_UPDATED_TIME,VERSION#,PARENT_DR_SID) values (2,'come',to_timestamp('19-SEP-20 07.18.56.271199000 AM','DD-MON-RR HH.MI.SSXFF AM'),1,2);
Insert into EMP (DR_SID,DR_NAME,LAST_UPDATED_TIME,VERSION#,PARENT_DR_SID) values (3,'come123',to_timestamp('13-FEB-21 05.05.51.645956000 AM','DD-MON-RR HH.MI.SSXFF AM'),1,3);
Insert into EMP (DR_SID,DR_NAME,LAST_UPDATED_TIME,VERSION#,PARENT_DR_SID) values (4,'come456',to_timestamp('13-FEB-21 05.05.51.951505000 AM','DD-MON-RR HH.MI.SSXFF AM'),1,4);
Insert into EMP (DR_SID,DR_NAME,LAST_UPDATED_TIME,VERSION#,PARENT_DR_SID) values (5,'this should not come2',to_timestamp('18-APR-20 05.05.52.425734000 AM','DD-MON-RR HH.MI.SSXFF AM'),2,1);
Insert into EMP (DR_SID,DR_NAME,LAST_UPDATED_TIME,VERSION#,PARENT_DR_SID) values (6,'this should COME',to_timestamp('18-APR-20 05.05.52.425734000 AM','DD-MON-RR HH.MI.SSXFF AM'),3,1);
SELECT DR_SID, DR_NAME, LAST_UPDATED_TIME, VERSION#, PARENT_DR_SID FROM emp ;
以下查詢需要轉換為 Hive,有人可以幫忙嗎?
SELECT DR_SID, DR_NAME, LAST_UPDATED_TIME, VERSION#, PARENT_DR_SID FROM emp t
where (version#,parent_dr_sid)
in (select max(version#),parent_dr_sid from emp group by parent_dr_sid)
;
我試圖找出哪條記錄是最新的,所以我使用 version# 列(如果 version# 列具有最大值,則記錄是最新的,并且它以前的記錄是舊的并且不顯示)。
現在記錄如何相互鏈接,所以我們有兩列,dr_sid is pk并且parent_dr_sid包含相同的值以顯示該記錄與哪個舊記錄鏈接。
您可以在此處看到示例,在給定的示例代碼中,dr_sid = 1在 parent_dr_sid 中??出現了 3 次,所有這 3 條記錄的parent_dr_sid值都與 1 相同(鏈接到 dr_sid)。
現在我想要下面的 o/p,你能在 hive 中做同樣的事情嗎?
僅供參考 - 我們無法更新表,因此嘗試以這種方式更新記錄并以這種方式獲取。
DR_SID, DR_NAME, LAST_UPDATED_TIME, VERSION#, PARENT_DR_SID
1 this should not come1 18-APR-20 05.05.52.425734000 AM 1 1
2 come 19-SEP-20 07.18.56.271199000 AM 1 2
3 come123 13-FEB-21 05.05.51.645956000 AM 1 3
4 come456 13-FEB-21 05.05.51.951505000 AM 1 4
5 this should not come2 18-APR-20 05.05.52.425734000 AM 2 1
6 this should COME 18-APR-20 05.05.52.425734000 AM 3 1
uj5u.com熱心網友回復:
用于left semi join模擬元組的in語意。
with input as (
select inline(array(
(1,1),
(1,2),
(2,1),
(2, 2)
)) as (c1, c2)
)
, flt as (
select inline(array(
(1,1),
(2, 2)
)) as (f1, f2)
)
select *, split(version(), ' ')[0] as v
from input
left semi join flt
on input.c1 = flt.f1
and input.c2 = flt.f2
| 輸入.c1 | 輸入.c2 | v |
|---|---|---|
| 1 | 1 | 3.1.3000.7.1.7.0-551 |
| 2 | 2 | 3.1.3000.7.1.7.0-551 |
uj5u.com熱心網友回復:
我不了解 Hive,所以這些很可能是完全無用的建議;但是,看看它是否有幫助。
如果您可以在FROM子句中使用子查詢,您可以執行以下操作:
select e.*
from emp e join (select max(a.create_tm) create_tm, a.open_dt
from emp a group by a.open_dt
) x
on x.create_tm = e.create_tm
and x.open_dt = e.open_dt;
或者,通過連接值使您的子查詢回傳單列。它們看起來像“時間”和“日期”(我不知道它們的資料型別,因此您可能需要將例如TO_CHAR函式應用于這些列;這沒問題,只要它回傳所需的結果):
select *
from emp
where concat(create_tm, open_dt) in (select concat(max(create_tm), open_dt)
from emp
group by open_dt);
uj5u.com熱心網友回復:
這是有效的:
SELECT DR_SID, DR_NAME, LAST_UPDATED_TIME, VERSION#--, PARENT_DR_SID
FROM emp t join
(select max(version#) v,parent_dr_sid from emp group by parent_dr_sid) t2
on t.version#=t2.v and t.parent_dr_sid = t2.parent_dr_sid
;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/511169.html
標籤:甲骨文Hadoop蜂巢大数据oracle-sqldeveloper
上一篇:運行hdfsdfs命令時出錯
下一篇:無法在hbaseshell中創建表:org.apache.hadoop.hbase.PleaseHoldException:Master正在初始化
