【问题标题】:SQL Server 2005 - Counter in a select querySQL Server 2005 - 选择查询中的计数器
【发布时间】:2012-02-28 16:34:29
【问题描述】:

我想在我的存储过程的选择查询中有一个行计数器,但计数器不会为每一行递增。增量将取决于字段之一的值。相当于这个无效代码的东西:

DECLARE @RowIndex as int
SET @RowIndex = 0
SELECT
   f1, f2, f3,
   CASE
      WHEN f1 > 3 THEN @RowIndex += 1
      ELSE @RowIndex
   END AS MyIndex
FROM
   MyTable

我应该如何在 SQL Server 2005 中做到这一点?

【问题讨论】:

    标签: sql-server-2005 counter select-query


    【解决方案1】:
    SELECT f1,f2,f3, DENSE_RANK() OVER (ORDER BY tempf1)-1 AS myIndex
    FROM
    (
      SELECT f1, f2, f3, CASE WHEN f1>3 THEN f1 ELSE 0 END AS tempf1
      FROM
      MyTable
    ) AS A
    

    请使用 Dense_Rank() 按 f1 排序。试试这个。

    【讨论】:

    • 我试过了,SQL Server 说查询无效。我的主要问题是在查询中分配一个值。即使没有 CASE...END 语句,简单地说 @RowIndex = 5 as MyIndex 也会使查询无效。
    • CASE 语句的 ELSE 部分需要什么值?变量的值总是 0 还是以前的值?
    • 如果满足条件,计数器将递增,否则保持不变。
    【解决方案2】:

    要在单个查询中执行此操作,您必须将表连接回自身以获取符合条件的行数或之前的行。此外,您肯定需要一个对表格进行排序的列。在这种情况下,我们将该列称为 f2。

    SELECT a.f1, a.f2, a.f3
        , SUM(CASE WHEN b.f1 > 3 THEN 1 ELSE 0 END) AS MyIndex
    FROM MyTable a
    JOIN MyTable b
        ON a.f2 >= b.f2
    GROUP BY a.f1, a.f2, a.f3
    

    【讨论】:

    • 我会试试的。我只是稍等片刻,看看是否会发布其他建议(我认为你的建议可行,但我认为会有更简单的解决方案;也许毕竟不是)。顺便说一句,我已经有一个对表格进行排序的列。谢谢!
    • 附录:我想要一个更简单的解决方案,因为我的实际查询比我给出的简化示例复杂得多。
    • 愿意与您分享示例数据,因为我想不出这在哪里有效。看到它not work here
    • 这个对我来说是一张简单的桌子。现在,我将看看如何在我的实际工作中实现它。非常感谢!
    • +1 :我不能投票,因为我是这里的新手,但如果可以的话,我会。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    相关资源
    最近更新 更多