【问题标题】:Auto-numbering a field according to the sequence of fields根据字段顺序自动编号字段
【发布时间】:2022-11-30 20:35:10
【问题描述】:

在表 2 中上一个任务 new entries by one id 的延续中,我有另一个字段 order。此字段应根据每个 param 字段为每个条目编号(如 1、2、3..30),例如: 表格1:

callid   | par0 | par1 | par2 | par3 | par4 | par5 | par6 | par7 | par8 | par9 | par10 |

1234567  | 24   | 2    | null | 91   | 58   | null | 25   | 19   | 77   | 62   | null  |

表_2:

callid  |  theme_code | order |
------------------------------
1234567 |      24     |   1   |
------------------------------
1234567 |     2       |   2   |
------------------------------
1234567 |     91      |   3   |
------------------------------
1234567 |     58      |   4   |
------------------------------
1234567 |     25      |   5   |
------------------------------
1234567 |     19      |   6   |
------------------------------
1234567 |     77      |   7   |
------------------------------
1234567 |     62      |   8   |
------------------------------

我考虑过使用序列自动编号的选项,但它会随机编号记录,我需要根据参数字段的顺序进行编号。 如果一个call_id填入了param0,param1,param2,param5,param6,那么param0-1,param1-2,param5-3,param6-4的顺序就是。

【问题讨论】:

  • 目前还不清楚,但您可以在 ROW_NUMBER() OVER(PARTITION BY called ORDER BY ...) 的 ORDER BY 中使用 NULLS LAST 或 COALESCE 来为您提供所需的 ID。

标签: sql oracle


【解决方案1】:

在上一个答案的延续中,您可以更改 unpivot 操作以为每个 parNN 列名称提供一个数值 - 在您的示例中为 0 到 10 - 然后生成“订单”(这是一个保留字,除非你使用带引号的标识符——我不建议这样做,即使你是我也会避免混淆名称——所以我使用了'pos')使用像rank()这样的分析函数:

select callid, theme_code, rank () over (partition by callid order by par) pos
from table1
unpivot (
  theme_code
  for par in (par0 as 0, par1 as 1, par2 as 2, par3 as 3, par4 as 4,
    par5 as 5, par6 as 6, par7 as 7, par8 as 8, par9 as 9, par10 as 10)
)
CALLID THEME_CODE POS
1234567 24 1
1234567 2 2
1234567 91 3
1234567 58 4
1234567 25 5
1234567 19 6
1234567 77 7
1234567 62 8

fiddle

【讨论】:

  • 有一个问题,如果par3,par4为空,这个字段最后的结果会是值1,2,5,6,7,8。也就是说,由于没有这些字段,所以在order字段应该移位,最后结果一定是1,2,3,4,5,6。我还是不明白怎么解决这个问题,也没有替代方案
  • @AndreyRomanov - 我不确定你的意思。这个移位,因此对于您的示例,它得到 1、2、3、4、5、6、7、8。我的小提琴有第二个例子,它只填充了 par2、par5 和 par10,并且 pos 为 1、2、3。来自 unpivot 的 par 值有差距,但这并不重要;排行超过这不会在最终的 pos 值中留下空白。
猜你喜欢
  • 2011-06-07
  • 1970-01-01
  • 2012-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-24
相关资源
最近更新 更多