web-dev-qa-db-ja.com

SQL Server 2008のCount(Distinct([value))OVER(Partition by)

私はこれを書き、Oracleで正常に実行しました

COUNT (DISTINCT APEC.COURSE_CODE) OVER (
                                            PARTITION BY s.REGISTRATION_NUMBER
                                            ,APEC.APE_ID
                                            ,COV.ACADEMIC_SESSION
                                            ) APE_COURSES_PER_ACADEMIC_YEAR

SQL Serverで同じ結果を達成しようとしています(ソースデータベースはOracleを使用していますが、ウェアハウスはSQL Serverを使用しています)。

SQL Server 2008のウィンドウ関数ではこの区別がサポートされていないことを知っています-誰かが代替案を提案できますか?

6
james.mullan

これが私が最近出会ったものです。私はこれからそれを得ました 投稿 。これまでのところ、それは私にとって本当にうまくいきます。

DENSE_RANK() OVER (PARTITION BY PartitionByFields ORDER BY OrderByFields ASC) +
DENSE_RANK() OVER (PARTITION BY PartitionByFields ORDER BY OrderByFields DESC) - 1 AS DistinctCount
8
JoeFletch

残念ながら、SQLServerではcount(distinct) overを実行できません。これはサブクエリで実行できます。アイデアは、各コースコード内の値を列挙することです(そして他の分割条件に従います)。次に、シーケンス番号が1の値をカウントアップします。

_select sum(case when cc_seqnum = 1 then 1 else 0 end) as APE_COURSES_PER_ACADEMIC_YEAR
from (select . . . ,
             row_number () OVER (PARTITION BY s.REGISTRATION_NUMBER, APEC.APE_ID,
                                              COV.ACADEMIC_SESSION,
                                              APEC.COURSE_CODE
                                 ORDER BY (SELECT NULL)
                                ) as cc_seqnum
      from . . . 
     ) t
_

複雑なクエリがあります。 count(distinct)row_number()に置き換えて、現在のクエリを最終クエリのサブクエリまたはCTEにすることをお勧めします。

9
Gordon Linoff