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 字段并不是真正的主键,而是重复的次数等于 start 和 end 指定的范围内不同奇数的数量。每条记录的真实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?

提前致谢。

4

2 回答 2

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

于 2012-05-24T01:37:36.007 回答
0

很抱歉没有尽快回复或对个别评论作出回应。@John Dewey,我相信当我尝试你的脚本时,它并没有正确地保持起始系列之间的差距,但我有动力去了解更多关于PARTITION关键字的信息,我认为我现在更加开明了。

由于这是针对 ETL 任务,我最终编写了代码以在提取(我猜它也算作转换)端的循环中生成真实 ID。

于 2012-07-06T20:37:00.430 回答