2017-01-14 40 views
0

我有如下表(table1):替代DENSE_RANK

f_name | email 
---------|--------------------- 
john  | [email protected] 
peter | [email protected] 
johnny | [email protected] 
peter8 | [email protected] 
... 

我想補充一個Group號碼相同的電子郵件值列:

f_name | email    |Group | 
---------|---------------------|------| 
john  | [email protected] | 1 | 
peter | [email protected] | 2 | 
johnny | [email protected] | 1 | 
peter8 | [email protected] | 2 | 
... 

我使用以下命令:

SELECT 
    email, 
    s_index = ROW_NUMBER() OVER(PARTITION BY [email] ORDER BY [email]), 
    t_index = DENSE_RANK() OVER (ORDER BY [email]) 
FROM dbo.table1 

這是在Oracle中執行大數據的最佳方式嗎?它如何在Impala中完成?

+0

如果這些功能做你想要什麼,然後他們是做到這一點的最佳方式。我相信Impala也支持他們。 –

+0

你有沒有性能問題? –

+0

我認爲附加的代碼不是100%正確的。我想比較它的替代方式。之後,我會檢查性能。 – Avi

回答

1

可能慢得多,也許不適用;但如果你正在尋找一個替代DENSE_RANK()...

如果你的表中有 - 除了f_nameemail - 一些獨特的ID,那麼可以把每email -group的最小ID作爲一個值groupId。當然,的groupId必須具有相同類型的ID,它不應該的問題,對於groupId值不連續的,即他們將有差距:

CREATE TABLE Table1 
    ("id" int, "f_name" varchar2(9), "email" varchar2(21), "groupId" int) 

\\ 

INSERT ALL 
    INTO Table1 ("id", "f_name", "email") 
     VALUES (1, 'john', '[email protected]') 
    INTO Table1 ("id", "f_name", "email") 
     VALUES (2, 'peter', '[email protected]') 
    INTO Table1 ("id", "f_name", "email") 
     VALUES (3, 'johnny', '[email protected]') 
    INTO Table1 ("id", "f_name", "email") 
     VALUES (4, 'peter8', '[email protected]') 
SELECT * FROM dual 

\\ 

update table1 set "groupId" = 
    (select min(t2."id") as groupId 
    from table1 t2 
    where table1."email" = t2."email" 
    group by t2."email" 
) 
+0

非常感謝@Stephan Lechner,請問您可以添加如何使用DENSE_RANK調整代碼以適應您提供的相同解決方案? – Avi