带行计数器的SQLServer SQL查询

时间:2009-01-29 17:52:21

标签: sql sql-server

我有一个SQL查询,它返回一组行:

SELECT id, name FROM users where group = 2

我还需要包含一个具有递增整数值的列,因此第一行需要在计数器列中为1,第二行为2,第三行为3等

这里显示的查询只是一个简化的例子,实际上查询可能是任意复杂的,有几个连接和嵌套查询。

我知道这可以使用带有自动编号字段的临时表来实现,但有没有办法在查询本身内完成?

4 个答案:

答案 0 :(得分:26)

对于初学者来说,有些东西:

SELECT my_first_column, my_second_column,
    ROW_NUMBER() OVER (ORDER BY my_order_column) AS Row_Counter
FROM my_table

但是,重要的是要注意ROW_NUMBER() OVER (ORDER BY ...)构造仅确定Row_Counter的值,但不保证结果的排序。

除非SELECT本身具有明确的ORDER BY子句,否则结果可以按任何顺序返回,具体取决于SQL Server如何决定优化查询。 (See this article for more info。)

保证结果始终Row_Counter顺序返回的唯一方法是对SELECT和{{1}应用完全相同的排序}:

ROW_NUMBER()

上面的模式将始终以正确的顺序返回结果,并且适用于简单查询,但是SELECT my_first_column, my_second_column, ROW_NUMBER() OVER (ORDER BY my_order_column) AS Row_Counter FROM my_table ORDER BY my_order_column -- exact copy of the ordering used for Row_Counter 子句中可能有几十个表达式的“任意复杂”查询呢?在那些情况下,我更喜欢这样的东西:

ORDER BY

使用嵌套查询意味着不需要复制复杂的SELECT t.* FROM ( SELECT my_first_column, my_second_column, ROW_NUMBER() OVER (ORDER BY ...) AS Row_Counter -- complex ordering FROM my_table ) AS t ORDER BY t.Row_Counter 子句,这意味着更少的混乱和更容易的维护。外部ORDER BY也使查询的目的更加清晰。

答案 1 :(得分:10)

在SQL Server 2005及更高版本中,您可以使用ROW_NUMBER()函数,该函数具有排序顺序选项以及计数完成(和重置)的组。

答案 2 :(得分:2)

最简单的方法是使用变量行计数器。但是它将是两个实际的SQL命令。一个设置变量,然后查询如下:

SET @n=0;
SELECT @n:=@n+1, a.* FROM tablename a

您的查询可能与连接等一样复杂。我通常将其作为存储过程。您可以使用变量获得各种乐趣,甚至可以使用它来计算字段值。关键是:=

答案 3 :(得分:-3)

这是一种不同的方法。 如果您有几个不可连接的数据表,或者由于某种原因您不想同时计算所有行,但仍希望它们与同一行数相同,则可以创建一个表来完成工作对你而言。

示例:

import GameplayKit
import UIKit

class guessViewController: UIViewController {

@IBOutlet weak var button1: UIButton!
@IBOutlet weak var button2: UIButton!
@IBOutlet weak var button3: UIButton!
@IBOutlet weak var button4: UIButton!

var cards = [String]()
var score = 0
var correctAnswer = 0

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    cards += ["boots", "tired", "heart", "angry", "leaf", "sleepy", "apple", "chestnuts", "pumpkin", "rainbow"]

    askQuestion()

    //cards = GKRandomSource.sharedRandom().arrayByShufflingObjectsInArray(cards) as! [String]

}

func askQuestion() {
    button1.setImage(UIImage(named: cards[0]), forState: .Normal)
    button2.setImage(UIImage(named: cards[1]), forState: .Normal)
    button3.setImage(UIImage(named: cards[2]), forState: .Normal)

    //title = cards[correctAnswer].uppercaseString
}

@IBAction func buttonTapped(sender: UIButton) {

    if sender.tag == correctAnswer {
        score++
        print("correct")

    } else {

        score--
        print("incorrect")

        }
    }
}