2012-05-24 82 views
0

我有一個表結構爲等一系一列數字:如何生成與基於最小和最大價值

fake_id   start   end   misc_data 
------------------------------------------------------ 
1    101   105   ab 
1    101   105   cd 
1    101   105   ef 
2    117   123   gh 
2    117   123   ij 
2    117   123   kl 
2    117   123   mn 
3    51    53   op 
3    51    53   qr 

注意,fake_id領域是不是一個真正的主鍵,但重複次數等於開始和結束所指定範圍內的不同奇數的數量。 real每個記錄的id是該範圍中的奇數之一。我需要寫一個返回fake_id,misc_data,以及包含這些奇數產生真正的ID另一列的查詢,如下所示:

fake_id   real_id   misc_data 
------------------------------------------ 
1    101    ab 
1    103    cd 
1    105    ef 
2    117    gh 
2    119    ij 
2    121    kl 
2    123    mn 
3    51    op 
3    53    qr 

據我所知,目前還不能保證會有序列中沒有空白(例如,可能沒有範圍21-31的記錄)。如何告訴查詢(或過程,但查詢更可取),對於每個具有特定fake_id的記錄,它應該返回開始和結束之間的下一個奇數?

此外,有沒有辦法讓misc_data的值屬於一個特定的real_id?以第二個表格爲例,我怎麼能告訴查詢「ab」屬於real_id 101而不是103?

在此先感謝。

+0

您如何計劃爲real_id訂購新值? –

回答

4

猜在這裏,你打算排序misc_data

SELECT "fake_id", 
     ((ROW_NUMBER()OVER(PARTITION BY "start" 
         ORDER BY "misc_data")-1)*2)+"start" AS "real_id", 
     "misc_data" 
FROM t 
ORDER BY "misc_data"; 

http://www.sqlfiddle.com/#!4/ae23c/23

0

道歉不回答遲早的個人意見。 @John Dewey,我相信當我嘗試你的腳本時,它並沒有正確地保持起點系列之間的差距,但我有興趣瞭解更多關於PARTITION的關鍵字,我想我現在更加開明。

因爲這是ETL任務,所以我最終編寫了代碼來生成真正的ID在提取(我猜它也算作變換)循環中的一個循環。

相關問題