基于 select 语句中的特定记录集的 Oracle 序列/编号生成
Posted
技术标签:
【中文标题】基于 select 语句中的特定记录集的 Oracle 序列/编号生成【英文标题】:Oracle sequence/number generation based on specific set of records in a select statement 【发布时间】:2014-10-27 16:30:38 【问题描述】:我正在使用 oracle 查询获取一个特定的结果集。因为我有一个表示下一组记录的键。我需要使用密钥并为这些记录生成序列。 例如没有序列的 oracle 结果集如下所示。
PROD_ID SEQUENCE TYPE QUANTITY
1-9ER 200 Capsule 50
1-9ER 210 Tablet 80
1-9ER 220 Tonic 75
1-9ER 230 Injection 90
1-7OR 200 Capsule 80
1-7OR 210 Tablet 30
1-7OR 220 Tonic 15
1-7OR 230 Injection 20
因此,我需要通过 SQL 选择查询嵌入序列,一旦找到不同的产品 ID,它应该递增到下一组 100。那么,是否可以为此在 oracle 中编写查询? 我只是在查询中使用一般序列,但这并不能解决我的问题。请向我提供有关如何解决此问题的想法。
谢谢。
【问题讨论】:
甲骨文有可能吗?是的。如何?解析函数。 你能提供一个预期输出的例子吗? 【参考方案1】:select prod_id,
100 * dense_rank() over (order by prod_id) + row_number() over (partition by prod_id order by type) - 1 as seq_number,
type,
quantity
from products
order by prod_id, type;
SQLFiddle 示例:http://sqlfiddle.com/#!4/d97c6/2
编辑问题更改后:
您可以通过更改窗口函数的使用来更改数字的生成方式:
select prod_id,
200 + row_number() over (partition by prod_id order by type) * 10 as seq_number,
type,
quantity
from products
order by prod_id, type;
SQLFiddle:http://sqlfiddle.com/#!4/d97c6/3
【讨论】:
嗨,我们能否调整查询以获取序列,使序列看起来更像重复序列。例如PROD_ID 序列 类型 数量 1-9ER 200 胶囊 50 1-9ER 201 片剂 80 1-9ER 202 补品 75 1-9ER 203 注射剂 90 1-7OR 200 胶囊 80 1-7OR 201 片剂 30 1-7OR 202 补品 15 1-7OR 203注入 20 谢谢。 @Cool_Oracle:对不起,我不明白。该示例输出完全您在问题中所写的内容。 非常感谢您的回答。但是,我想将序列增加 10 并在遇到不同的 PROD_ID 后重复相同的序列。我对主要问题进行了更改,只是为了让您参考清楚。以上是关于基于 select 语句中的特定记录集的 Oracle 序列/编号生成的主要内容,如果未能解决你的问题,请参考以下文章