請看下面的一個表格,我想創建一個不同的電話號碼列表,排名組號碼需要采取優先級下降1-4。該示例應導致ID 4,9,10(突出顯示為紅色x)被刪除,因為他們共享重復的電話號碼,但在一個較低的優先級組。
我已經嘗試了很多步驟來實現這一點,并創建了一個代理密鑰,但我希望有人能告訴我如何在一個步驟中實現這一點,以提高效率(并提高我的SQL)。
在SAS9中,我有一個coalescec函數,我可以在其中創建一個新變量并指示優先級-但我知道SQL中沒有這樣的函數。
https://documentation.sas.com/doc/en/vdmmlcdc/8.1/ds2ref/n0crpo0xd76wb3n1poba9wmu1a6q.htm
請參見下面SQL中的模擬數據
CREATE TABLE MT_TEMP_TEL2 (
ID INT NOT NULL,
GROUP INT NOT NULL,
TEL1 VARCHAR(11),
TEL2 VARCHAR(11),
TEL3 VARCHAR(11),
TEL4 VARCHAR(11)
);
INSERT INTO MT_TEMP_TEL2
VALUES
(1,4,"79000000000","","",""),
(2,1,"12111111111","79999999999","",""),
(3,1,"","13842222222","",""),
(4,2,"","","78888888888","12111111111"),
(5,3,"","73333333333","",""),
(6,1,"15278888888","","",""),
(7,2,"","","71111111111",""),
(8,4,"","13843333333","","72222222222"),
(9,4,"","73333333333","",""),
(10,3,"75555555555","","12155555555","13842222222");
這是如上所述的預期結果,我們現在刪除了第4、9和10行
在提到
coalesce
時,我曾假設目標是將4列壓縮為一個值列表,而預期結果示例現在顯示的情況并非如此。有幾種方法可以解決這個問題,一種是使用
window functions
為每個值分配一個序列號;為此,必須將這些值組合到一個列表中,您可以使用union
,然后將組合值partitioned
作為該列表的結果,并且每個重復項都獲得一個連續的行號。那就是只保留那些值為1的。