基于 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 序列/编号生成的主要内容,如果未能解决你的问题,请参考以下文章

我想使用输出多个记录集的多个选择语句创建一个视图

java获得刚刚更新的记录集的id(主键)

SQL学习试图

select语句中的mysql计算

如何在 For 语句中运行 If 语句以仅显示数据集的特定行

MS SQL语句declare游标的求助