2012-05-24 44 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在提取(我猜它也算作变换)循环中的一个循环。

相关问题