【问题标题】:Row_Number based on two columnsRow_Number 基于两列
【发布时间】:2020-07-15 14:09:06
【问题描述】:

我正在尝试创建下面的行号,我尝试了很多选项,但似乎没有一个有效。我将不胜感激。

我希望行顺序查看 sub_id 并为每个执行一个序列号 1、2、3...然后我希望它查看磁盘,如果发生变化,请再次返回 1。我已经尝试将它们连接起来并使用一个键,但我似乎无法让它工作。

ID  sub_id  disc    ROW_NUMBER
1     1      OT       1
1     1      OT       2
1     1      OT       3
1     2      DT       1
1     2      DT       2
1     3      SL       1
1     3      SL       2
1     4      PH       1
1     4      PH       2
1     4      OT       1
1     5      OT       1
1     5      PH       2
1     5      DT       1
1     6      DT       1
1     6      DT       2
1     6      DT       3
1     7      SL       1
1     7      SL       2
1     7      DT       1
1     8      SL       1
1     8      SL       2
1     8      SL       3
1     9      DT       1
1     9      DT       2
1     9      DT       3
1     10     PH       1
1     10     DT       1
1     10     DT       2
1     11     OT       1
1     11     OT       2
1     11     OT       3
1     12     OT       1
1     12     OT       2
1     12     OT       3

更新 row_number() OVER (PARTITION BY sub_id ORDER BY disc) 不起作用。 sub_id 变为 2 时排序出错。此时需要恢复为 1,但它是 2。

【问题讨论】:

  • “我已经尝试了很多选项,但似乎没有一个有效” 这些尝试是什么,您在问题中忽略了它们?您还标记了 2 个完全不同的 RDBMS,您真正使用的是 MySQL 还是 SQL Server?我已经删除了冲突的标签。请重新标记您实际使用的产品。

标签: sql sql-server sql-server-2017


【解决方案1】:

你似乎想要:

row_number() over (partition by id, sub_id, disc order by id)

注意:您没有指定列顺序的列,甚至没有唯一标识每一行的列。因此,这只使用order by id。您可能希望在其中包含一些其他列。

【讨论】:

  • 在数据集中没有具体的顺序,所以我按照ID、子ID、磁盘的顺序排列。这个不行,我以前试过。请参阅下面的评论。
  • @BeckyPurland 。 . .请说明这在 db/sql 小提琴中是如何不起作用的。它似乎完全符合您的要求。
  • 我不知道什么是 db/sql 小提琴。我将代码完全按照发布的方式放入,答案与我的问题不同。它是 1,2,3,2,3,1,3。这不是我需要的。我尝试连接 sub_id 和 disc,然后使用 row_number() over(按键顺序分区),我得到了相同的答案。
  • @BeckyPurland 。 . .至少编辑问题并将表创建和插入语句放在那里,以便可以轻松复制数据。
  • 数据已经在表中,我正在查询表,所以我不需要创建表和插入数据。我只是想创建一个 row_number 或 rank 语句来做我需要做的事情,但这似乎是一项不可能完成的任务。
【解决方案2】:
SELECT ID , sub_ID , disc , ROW_NUMBER() OVER (PARTITION BY sub_ID ORDER BY disc)   from your table

【讨论】:

  • 这与 Gordon 的回答有何不同?
  • 我已经尝试过了,但它不起作用。当 Sub ID 变为 2 时,行号变为 2,而不是回到 1。
  • 当我使用相同的数据( ID 、 sub_ID 、 Disc)时,我得到了你想要的 Row_Number 我将数据插入到一个表中,我得到了与你在问题中发布的结果相同的结果Larnu 的回答:我们同时写的——他在我面前发帖,我填满了所有栏目,就像要求的问题一样。我正在使用 SQL 2012
猜你喜欢
  • 1970-01-01
  • 2014-11-17
  • 2021-10-26
  • 1970-01-01
  • 2013-04-11
  • 2022-01-01
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
相关资源
最近更新 更多