-1

我在 SQL 中创建重复计数器变量时遇到问题。这是我想做的-

x_id       date                 num       p_id       Counter
2113       4/1/2013              11           444         1
2113       4/1/2013              11           445         2
2113       4/1/2013              21           448         3
2113       4/1/2013              21           460         4
2113       4/1/2013              21           461         5
2113       4/1/2013              31           463         6
2116       4/1/2013              7              982         1
2116       4/1/2013              7              985         2
2116       4/1/2013              8              987         3

当我按 x_id、date、num 和 p_id 对这些数据进行排序时,我拥有所有我希望它创建计数器列的方式。

我遇到的困难是在我想要的地方打破并重新启动这个计数器列。我希望计数器在每次发生新的 x_id/日期配对时重新开始(因此,如果其中任何一个发生变化,计数器应该回到 1)。

有人告诉我,创建光标是执行此操作的最佳方法,但我无法在网上找到任何看起来足够相似的示例。

看起来这应该是一件相对简单的事情......有人可以帮我吗?

非常感谢!

4

3 回答 3

3

如果您使用的是支持窗口函数的数据库系统,那么这是ROW_NUMBER一项工作:

select x_id,date,num,p_id,
  ROW_NUMBER() OVER (PARTITION BY x_id, date ORDER BY num, p_id) as counter
from table

SQL Server 帮助ROW_NUMBER(),但它也被许多其他数据库系统支持,例如 Oracle、PostgreSQL、DB2(但不是 MySQL):

返回结果集分区内行的序号,每个分区的第一行从 1 开始

于 2013-07-24T14:08:12.327 回答
1

MySQL的解决方案:

你不需要一个光标

SELECT
yt.*,
@counter := CASE WHEN @prev_x != x_id OR @prev_date != `date` THEN 1 ELSE @counter + 1 END AS counter,
@prev_x := x_id,
@prev_date := `date`
FROM yourTable yt
, (SELECT @counter:=1, @prev_x:=NULL, @prev_date:=NULL) vars
ORDER BY x_id, `date`, num, p_id
于 2013-07-24T14:07:55.123 回答
0

假设您使用的是 SQL Server/TSQL:

不要使用游标,而是使用DENSE_RANK()函数。

SELECT x_id, date, num, p_id, DENSE_RANK() OVER (ORDER BY x_id, date) as Counter FROM Table

更新:再次阅读问题,这可能不是上述情况的正确解决方案,它将保持计数器不变,直到相关值发生变化(1 表示第一六行,2 表示第二三行,等等)

于 2013-07-24T14:09:26.087 回答