通过oracle实现,图中表格内容的序号排序?

img


如何通过oracle实现,图中表格内容的序号排序?依次按ID的大小顺序,拿第2行中的内容,比较第1行中的a,如果是相同字符串,则序号相同,反之,则序号+1,再拿第3行中的内容,比较第2行中的b依次类推

通过存储过程的方式
可以参考这个写存储过程:https://blog.csdn.net/weixin_44740485/article/details/120995693

用窗口函数呗,序号列应该是自动生成的,而不是在你原有的基础上修改,所以只需要有id和tet列即可

用存储过程吧
先按照id排序再去计算新的序列号去添加

表名: test
字段: id,content
select * from
(SELECT id,content,DENSE_RANK() OVER( ORDER BY content asc ) as no FROM test ) t order by t.id,t.no asc

--创建一个临时表存储图中表格内容
WITH temp_table AS (
  SELECT 1 AS id, 'a' AS txt FROM dual
  UNION ALL
  SELECT 2 AS id, 'a' AS txt FROM dual
  UNION ALL
  SELECT 3 AS id, 'b' AS txt FROM dual
  UNION ALL
  SELECT 4 AS id, 'c' AS txt FROM dual
  UNION ALL
  SELECT 5 AS id, 'c' AS txt FROM dual
  UNION ALL
  SELECT 6 AS id, 'd' AS txt FROM dual
)
--使用DENSE_RANK()函数按照txt列进行排序,并按照id列进行分组,计算序号列
SELECT id, txt, DENSE_RANK() OVER (PARTITION BY id ORDER BY txt) AS 序号
FROM temp_table;

执行上述代码后,得到以下结果:

img


可以看到,序号列的值都是1,这是因为每个id都只有一个txt值,所以在每个id分组内,txt值都是最小的。如果您想要按照整个表格进行排序,而不是按照id分组,您可以去掉PARTITION BY子句,代码如下:

--创建一个临时表存储图中表格内容
WITH temp_table AS (
  SELECT 1 AS id, 'a' AS txt FROM dual
  UNION ALL
  SELECT 2 AS id, 'a' AS txt FROM dual
  UNION ALL
  SELECT 3 AS id, 'b' AS txt FROM dual
  UNION ALL
  SELECT 4 AS id, 'c' AS txt FROM dual
  UNION ALL
  SELECT 5 AS id, 'c' AS txt FROM dual
  UNION ALL
  SELECT 6 AS id, 'd' AS txt FROM dual
)
--使用DENSE_RANK()函数按照txt列进行排序,计算序号列
SELECT id, txt, DENSE_RANK() OVER (ORDER BY txt) AS 序号
FROM temp_table;


img


可以看到,序号列的值根据txt列的不同而变化,相同txt值的序号相同,不同txt值的序号递增。

【以下回答由 GPT 生成】

对于这个问题,可以使用Oracle的窗口函数和递归子查询来实现。下面是一个使用SQL语句解决这个问题的示例:

WITH sorted_rows AS (
  SELECT ID, 1, 2, 3,
         ROW_NUMBER() OVER (ORDER BY ID) AS 序号
  FROM 表名
), numbered_rows AS (
  SELECT ID, 1, 2, 3,
         CASE
           WHEN 1 = lag(1) OVER (ORDER BY ID) THEN lag(序号) OVER (ORDER BY ID)
           ELSE lag(序号) OVER (ORDER BY ID) + 1
         END AS 序号
  FROM sorted_rows
)
SELECT ID, 1, 2, 3, 序号
FROM numbered_rows
ORDER BY ID;

在这个SQL语句中,首先使用ROW_NUMBER()函数为每一行生成一个初始序号,并按照ID列进行排序。然后,使用lag()函数来比较当前行的列1与前一行的列1是否相同,根据条件生成新的序号。最后,通过查询结果的ID列进行排序并返回结果。

请替换上述示例中的表名为实际的表名,并将列1,列2,列3等替换为实际的列名。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

oracle 中有提供窗口函数 partition by 可以看看语法怎么使用。

使用row_number()函数计算每一条记录的序号,然后根据txt字段的值来判断序号是否相同或递增

我查了这篇文章应该能解决你的问题,https://blog.csdn.net/y2020520/article/details/128535818

先按照id排序再去计算新的序列号去添加

这种排序可以是用Oracle得开窗函数,dense_rank()考虑重复值

select a.*,dense_rank() over(order by txt) from 表名 a;

你的需求4楼的已经满足了吧。如果按照你后面评论里面说的,如果再次出现aa,需要重新分组的话,那么使用基本的sql实现不了,可以考虑建一个存储过程来实现

参考gpt
要通过 Oracle 实现表格内容的序号排序,您可以使用 Oracle SQL 中的窗口函数和排序功能。以下是一个示例查询,可以根据您的描述对表格进行排序并分配序号:

SELECT
  id,
  column1,
  column2,
  ROW_NUMBER() OVER (ORDER BY id) AS sequence_number
FROM
  your_table
ORDER BY
  id;

在上面的查询中,your_table 是您的表格名称,id 是用于排序的列名,column1column2 是您要比较的列名。ROW_NUMBER() OVER (ORDER BY id) 是窗口函数,它将根据 id 列的值为每一行分配一个序号。

请注意,上述查询仅提供了基本的排序功能,根据您的需求,您可能需要根据实际情况进行适当的修改。