14

これは私のコードです:

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;

BOLのこのページで、Microsoftは次のように述べています。

PARTITION BYが指定されていない場合、関数はクエリ結果セットのすべての行を単一のグループとして扱います。

したがって、私の理解に基づいて、最後のSELECTステートメントは次の結果をもたらします。すべてのレコードが1つのグループにあると見なされるので、そうですか?

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

誰でもその理由を説明するのを手伝うことができますか?ありがとう。

4

2 に答える 2

35

累計が表示されます(この機能はバージョン2012までSQL Serverに実装されていませんでした)。

ORDER BY、集約されるウィンドウを定義し、UNBOUNDED PRECEDING指定CURRENT ROWされていない場合はデフォルトとして定義します。SQL Serverのデフォルトでは、パフォーマンスの低い RANGEオプションが使用されますROWS

RANGE同点の場合、バージョンのウィンドウには現在の行(および前の行)だけでなく、現在の行と同じ値を持つ追加の同点の行も含まれるという点で、セマンティクスが異なりますa。これは、以下の結果でそれぞれがカウントした行数で確認できます。

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 BYOVER()

于 2013-02-13T18:22:42.440 に答える
1

ROWS / RANGEが指定されていないが、ORDER BYが指定されている場合、ウィンドウフレームのデフォルトとしてRANGE UNBOUNDED PRECEDING AND CURRENT ROWが使用されます。つまり、「UNBOUNDED PRECEDINGANDCURRENTROW」に注目しましょう。これにより、開始行から現在の行までの現在の合計が得られます。ただし、全体の数を知りたい場合は、指定することもできます

「UNBOUNDEDPRECEDINGおよびUNBOUNDEDFollowing」これはデータセット全体を考慮し、Over()はこれの単なるショートカットです

    select a,b,
count(*) over(order by a) as [count],
COUNT(*) OVER (ORDER BY a 
                         RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS [Range],
COUNT(*) OVER (ORDER BY a 
                         ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS  [Rows],
COUNT(*) OVER (ORDER BY a 
                         RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED Following) AS [Range_Unbounded_following],
COUNT(*) OVER (ORDER BY a 
                         ROWs BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED Following) AS [Row_Unbounded_following]
,COUNT(*) OVER () AS [Plain_over]
from t 
order by [count]

結果は

a        b        count       Range       Rows        Range_Unbounded_following Row_Unbounded_following Plain_over
-------- -------- ----------- ----------- ----------- ------------------------- ----------------------- -----------
NULL     NULL     4           4           1           12                        12                      12
NULL     NULL     4           4           2           12                        12                      12
NULL     NULL     4           4           3           12                        12                      12
NULL     NULL     4           4           4           12                        12                      12
a        b        7           7           5           12                        12                      12
a        b        7           7           6           12                        12                      12
a        b        7           7           7           12                        12                      12
c        d        11          11          8           12                        12                      12
c        d        11          11          9           12                        12                      12
c        d        11          11          10          12                        12                      12
c        d        11          11          11          12                        12                      12
e        NULL     12          12          12          12                        12                      12
于 2020-08-19T11:53:58.733 に答える