106

次のように、個別のNumUsersの現在の合計を取得するために、次のように記述しようとしています。

NumUsers = COUNT(DISTINCT [UserAccountKey]) OVER (PARTITION BY [Mth])

Management Studioは、これについてあまり満足していないようです。キーワードを削除するとエラーは消えますDISTINCTが、明確なカウントにはなりません。

DISTINCTパーティション関数内では不可能のようです。明確なカウントを見つけるにはどうすればよいですか?相関サブクエリなど、より従来の方法を使用しますか?

これをもう少し詳しく見てみると、これらの関数は、現在の合計を計算するためOVERに使用できないという点で、Oracleとは異なる動作をする可能性があります。SQL-Server

SQLfiddleにライブの例を追加しました。ここでは、パーティション関数を使用して現在の合計を計算しようとしています。

4

6 に答える 6

203

を使用した非常に簡単な解決策がありますdense_rank()

dense_rank() over (partition by [Mth] order by [UserAccountKey]) 
+ dense_rank() over (partition by [Mth] order by [UserAccountKey] desc) 
- 1

これにより、まさにあなたが求めていたものが得られます: 各月内の個別の UserAccountKeys の数。

于 2014-03-12T09:45:51.670 に答える
6

上記のDavidのソリューションと同様のソリューションを使用しますが、一部の行をカウントから除外する必要がある場合は、さらにひねりを加えます。これは、[UserAccountKey] が null にならないことを前提としています。

-- subtract an extra 1 if null was ranked within the partition,
-- which only happens if there were rows where [Include] <> 'Y'
dense_rank() over (
  partition by [Mth] 
  order by case when [Include] = 'Y' then [UserAccountKey] else null end asc
) 
+ dense_rank() over (
  partition by [Mth] 
  order by case when [Include] = 'Y' then [UserAccountKey] else null end desc
)
- max(case when [Include] = 'Y' then 0 else 1 end) over (partition by [Mth])
- 1

拡張された例を含む SQL Fiddle は、ここにあります。

于 2015-02-22T07:55:40.383 に答える
6

SQL-Server 2008R2 でこれを行う唯一の方法は、相関サブクエリまたは外部適用を使用することだと思います。

SELECT  datekey,
        COALESCE(RunningTotal, 0) AS RunningTotal,
        COALESCE(RunningCount, 0) AS RunningCount,
        COALESCE(RunningDistinctCount, 0) AS RunningDistinctCount
FROM    document
        OUTER APPLY
        (   SELECT  SUM(Amount) AS RunningTotal,
                    COUNT(1) AS RunningCount,
                    COUNT(DISTINCT d2.dateKey) AS RunningDistinctCount
            FROM    Document d2
            WHERE   d2.DateKey <= document.DateKey
        ) rt;

これは、提案した構文を使用してSQL-Server 2012で実行できます。

SELECT  datekey,
        SUM(Amount) OVER(ORDER BY DateKey) AS RunningTotal
FROM    document

ただし、の使用DISTINCTはまだ許可されていないため、DISTINCT が必要な場合、および/またはアップグレードがオプションでない場合OUTER APPLYは、最良のオプションだと思います

于 2012-06-26T08:20:20.670 に答える