如何在oracle中获取具有不同名称的每一行的序列?

Posted

技术标签:

【中文标题】如何在oracle中获取具有不同名称的每一行的序列?【英文标题】:How to get sequences for each row with different name in oracle? 【发布时间】:2012-01-18 12:34:33 【问题描述】:

问题:我需要用 select 语句获取 X 列的值,例如:

人 | X

--------------

名称1 | 1

名称1 | 2

名称1 | 3

名称2 | 1

名称2 | 2

名称3 | 1

....

这里的人数是无限的。

【问题讨论】:

【参考方案1】:
select 
  people,
  row_number() over(partition by people) as x
from yourtable

更新:作为 cmets 总结的小反馈: 正如 Dave Costa 和 APC 所说,结果是不确定的。也就是说,如果您明天运行此查询,则在某些情况下 first name1 可能会获得 id 2。但是查询仍然是正确的。 如果您的表具有 DateInserted、DateOfBirth 或其他可以在相同名称之间产生差异的属性,您可以改进查询,例如:

select 
  people,
  row_number() over(partition by people order by DateOfBirth) as x
from yourtable

【讨论】:

只是想添加一个注释,写的结果是不确定的,即在每个名称中,不能保证相同的行会从一次执行到下一次执行分配 1,2,3 .要使其具有确定性,请在分析窗口中添加ORDER BY 子句;该问题没有包含足够的信息来建议适当的排序。 是的,也谢谢 Dave Costa,我在按人分区后按人按顺序编辑代码,但直到 Florin Ghita 不接受此代码更改,没人能看到这个改进的代码...跨度> @user963601 - 我已投票拒绝您的编辑。按人排序不会有任何区别,因为该子句指定了在分区内的排序顺序。由于分区是 PEOPLE,因此查询仍然是不确定的。您需要的是一种排序顺序,它可以作为一种对具有相同 PEOPLE 值的记录进行优先排序的方式。诸如 DATE_CREATED 之类的列将符合要求,因此记录按最早或最近的顺序排列。 如果不包括按人排序,则:ORA-30485:窗口规范中缺少 ORDER BY 表达式 30485。00000 -“窗口规范中缺少 ORDER BY 表达式” *原因:要么此函数必须使用 ORDER BY 表达式,或者存在没有任何 ORDER by 表达式的聚合组。 @user963601 我已经在答案中总结了 cmets。

以上是关于如何在oracle中获取具有不同名称的每一行的序列?的主要内容,如果未能解决你的问题,请参考以下文章

反序列化在不同 MailChimp 列表中具有不同名称的合并字段和兴趣

如何在SSIS中的每一行中生成具有不同数据类型的固定宽度文件

如何在R中的一列中添加具有不同值的新行

如何反序列化具有相同名称但不同类型的 API 响应

如何在c#中使用具有相同名称但不同属性和结构的元素反序列化XML

SQL查询从具有相同列“名称”的其他两个表中获取具有不同值的单列“名称”[关闭]