Sql server 行数与计数(1)?

Sql server 行数与计数(1)?,sql-server,count,window-functions,row-number,Sql Server,Count,Window Functions,Row Number,这两个选择中哪一个更好 ROW_NUMBER() OVER (PARTITION BY...) 或 我找不到这样的问题 编辑: DBMS: SQL-SERVER (version >= 2008) In my case the over partition is guaranteed by a single field: ROW_NUMBER() OVER (PARTITION BY ELEMENT ORDER BY EMPLOYEE) COUNT(1) OVER (PARTITION BY

这两个选择中哪一个更好

ROW_NUMBER() OVER (PARTITION BY...)

我找不到这样的问题

编辑: DBMS: SQL-SERVER (version >= 2008)

In my case the over partition is guaranteed by a single field: ROW_NUMBER() OVER (PARTITION BY ELEMENT ORDER BY EMPLOYEE) COUNT(1) OVER (PARTITION BY ELEMENT ORDER BY EMPLOYEE)

ELEMENT EMPLOYEE ROW_NUMBER COUNT
0000001 00000003 1 1 0000001 00000004 2 2 0000001 00000005 3 3 0000003 00000045 1 1 0000003 00000046 2 2 数据库管理系统:SQL-SERVER(版本>=2008)

在我的例子中,过分区由单个字段保证: 行数()超过(按元素顺序按员工划分) 计数(1)超过(按要素顺序按员工划分)

元素员工行数\u计数
0000001 00000003 1 1 0000001 00000004 2 2 0000001 00000005 3 3 0000003 00000045 1 1 0000003 00000046 2 2
COUNT(1)
重复
ORDER BY
列中的同一组值时,其行为不同

以下是SQL Server的一个示例:

IF OBJECT_ID('tempdb..#Example') IS NOT NULL
    DROP TABLE #Example

CREATE TABLE #Example (
    Number INT,
    GroupNumber INT)

INSERT INTO #Example (
    Number,
    GroupNumber)
VALUES
    (NULL, 1),
    (100, 1),
    (101, 1),
    (102, 1),
    (103, 1),

    (NULL, 2),
    (NULL, 2),
    (NULL, 2),
    (200, 2),
    (201, 2),
    (202, 2),

    (300, 3),
    (301, 3),
    (301, 3),
    (301, 3),
    (302, 3)


SELECT
    E.*,
    RowNumber = ROW_NUMBER() OVER (PARTITION BY E.GroupNumber ORDER BY E.Number ASC),
    CountOver = COUNT(1) OVER (PARTITION BY E.GroupNumber ORDER BY E.Number ASC)
FROM
    #Example AS E
结果:

Number      GroupNumber RowNumber            CountOver
----------- ----------- -------------------- -----------
NULL        1           1                    1
100         1           2                    2
101         1           3                    3
102         1           4                    4
103         1           5                    5

NULL        2           1                    3 Here
NULL        2           2                    3
NULL        2           3                    3
200         2           4                    4
201         2           5                    5
202         2           6                    6

300         3           1                    1
301         3           2                    4 Here
301         3           3                    4
301         3           4                    4
302         3           5                    5

这是因为它是一个计数,而不是一个行号。你应该使用适合你需要的那一个。

这两个在做两件不同的事情。唯一与此模糊相关的是
SUM(1)
vs.
COUNT(*)
ROW_NUMBER()
可以用
COUNT(*)
来编写,但不是这样,效率不高,而且没有理由这样做,除非您仍然使用SQL Server 2000。您使用的是哪种?“SQL”只是一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品添加一个标签,
postgresql
oracle
sql-server
db2
,…@JeroenMostert:您如何知道Daniele正在使用sql-server?“我想知道,两种解决方案中哪一种在同等条件下性能最好。”这个比较实际上与性能无关。两个选项的结果不能保证相同。因此,任何性能差异都是由于固有的功能差异造成的,您应该选择满足功能需求的技术。如果你想要一个更合理的比较,你应该像前面提到的那样,
sum(1)over(…)
;在我的例子中,字段ORDER BY的值永远不会为null。它不仅用于null,重复的值也会增加计数(请参阅我的示例中的值301)。如果您的数据确保没有重复的值出现,那么这两个值的结果将始终相同,但对引擎来说,计数可能比行号更昂贵,尽管我怀疑我们是否能够注意到两者之间的性能差异。没错!我想知道,两种解决方案中哪一种在同等条件下表现最好。非常感谢以西结。
Number      GroupNumber RowNumber            CountOver
----------- ----------- -------------------- -----------
NULL        1           1                    1
100         1           2                    2
101         1           3                    3
102         1           4                    4
103         1           5                    5

NULL        2           1                    3 Here
NULL        2           2                    3
NULL        2           3                    3
200         2           4                    4
201         2           5                    5
202         2           6                    6

300         3           1                    1
301         3           2                    4 Here
301         3           3                    4
301         3           4                    4
302         3           5                    5