代码之家  ›  专栏  ›  技术社区  ›  THX-1138

SQL Server:获取表中记录的位置(序号)

  •  3
  • THX-1138  · 技术社区  · 14 年前

    我有一个存储任务队列的表。每个任务看起来都像:

    Id | Operation | Argument | Status
    

    操作是字符串
    参数是单个数字
    状态是: Queued , Busy , Complete , Failed

    我需要找出一个项目在队列中的位置,但需要跳过未排队的任务。

    例子:

    1 A 5 Queued   -- 1
    2 A 6 Queued   -- 2
    3 B 3 Busy     -- x
    4 B 4 Complete -- x
    5 A 8 Queued   -- 3
    

    预期位置如下 -- 位置 x 意味着请求毫无意义。

    问题: 什么是计算这种位置的好方法?
    现在我想:

    SELECT TOP 1 p.Position FROM
    (
        SELECT Id, Status, 
        ROW_NUMBER() over (order by Id) as Position 
        from QueuedJobs where Status = 0 AND Id <= @taskId
    ) as p
    order by Position desc
    

    英语:计算每个任务到我的任务的位置,并给我最后一个位置(这是我的任务)

    我关心的是性能,假设我有1000个记录,有很多请求(每秒100个)。
    数据库是SQL Server 2008

    2 回复  |  直到 14 年前
        1
  •  1
  •   Tim    14 年前

    没有ORDERBY子句的查询可以按任何顺序返回行。使用什么标准对不忙或未完成的排队请求进行排序?是先进先出的队伍吗?最古老的请求在上面?通常,datetime值用于此目的。在任何情况下,我都会按照前端查询返回的顺序对行进行编号,这样做会更有效率。

        2
  •  0
  •   Lynette Duffy    14 年前

    如果状态0表示“排队”,则:

    Select Count(*)
    From QueuedJobs
    Where Status = 0
      and Id <= @taskId
    

    应该告诉你你在哪里:)