gpt4 book ai didi

sql - TSQL OVER 子句 : COUNT(*) OVER (ORDER BY a)

转载 作者:行者123 更新时间:2023-12-02 08:59:27 24 4
gpt4 key购买 nike

这是我的代码:

USE [tempdb];
GO

IF OBJECT_ID(N'dbo.t') IS NOT NULL
BEGIN
DROP TABLE dbo.t
END
GO

CREATE TABLE dbo.t
(
a NVARCHAR(8),
b NVARCHAR(8)
);
GO

INSERT t VALUES ('a', 'b');
INSERT t VALUES ('a', 'b');
INSERT t VALUES ('a', 'b');
INSERT t VALUES ('c', 'd');
INSERT t VALUES ('c', 'd');
INSERT t VALUES ('c', 'd');
INSERT t VALUES ('c', 'd');
INSERT t VALUES ('e', NULL);
INSERT t VALUES (NULL, NULL);
INSERT t VALUES (NULL, NULL);
INSERT t VALUES (NULL, NULL);
INSERT t VALUES (NULL, NULL);
GO

SELECT a, b,
COUNT(*) OVER (ORDER BY a)
FROM t;

关于this page of BOL ,微软表示:

If PARTITION BY is not specified, the function treats all rows of the query result set as a single group.

因此,根据我的理解,最后一个 SELECT 语句将给出以下结果。既然所有记录都被视为一个组,对吧?

a        b        
-------- -------- -----------
NULL NULL 12
NULL NULL 12
NULL NULL 12
NULL NULL 12
a b 12
a b 12
a b 12
c d 12
c d 12
c d 12
c d 12
e NULL 12

但实际结果是:

a        b        
-------- -------- -----------
NULL NULL 4
NULL NULL 4
NULL NULL 4
NULL NULL 4
a b 7
a b 7
a b 7
c d 11
c d 11
c d 11
c d 11
e NULL 12

谁能帮忙解释一下为什么?谢谢。

最佳答案

它提供了运行总计(此功能直到 version 2012 才在 SQL Server 中实现。)

ORDER BY定义要聚合的窗口 UNBOUNDED PRECEDINGCURRENT ROW未指定时作为默认值。 SQL Server 默认为less well performing RANGE选项而不是 ROWS .

在关系的情况下,它们具有不同的语义,因为 RANGE 的窗口版本不仅包括当前行(和前面的行),还包括具有相同值 a 的任何附加绑定(bind)行。作为当前行。这可以从下面结果中每个人计算的行数中看出。

SELECT  a, 
b,
COUNT(*) OVER (ORDER BY a
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS [Rows],
COUNT(*) OVER (ORDER BY a
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS [Range],
COUNT(*) OVER() AS [Over()]
FROM t;

返回

a        b        Rows        Range       Over()
-------- -------- ----------- ----------- -----------
NULL NULL 1 4 12
NULL NULL 2 4 12
NULL NULL 3 4 12
NULL NULL 4 4 12
a b 5 7 12
a b 6 7 12
a b 7 7 12
c d 8 11 12
c d 9 11 12
c d 10 11 12
c d 11 11 12
e NULL 12 12 12

要获得您期望的结果,请忽略两者 PARTITION BYORDER BY并使用空 OVER()条款(也在上面显示)。

关于sql - TSQL OVER 子句 : COUNT(*) OVER (ORDER BY a),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14860162/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com