【问题标题】:Count (Distinct ([value)) OVER (Partition by) in SQL Server 2008SQL Server 2008 中的计数(不同([值))OVER(分区依据)
【发布时间】:2015-02-18 10:05:05
【问题描述】:

我已经写好了这个并在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 中的窗口函数不支持 distinct - 任何人都可以提出替代方案吗?

【问题讨论】:

标签: sql sql-server-2008 window-functions


【解决方案1】:

这是我最近遇到的。我是从这个post 得到的。到目前为止,它对我来说非常有效。

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

【讨论】:

  • 太好了,谢谢!
  • 这包括 NULL 值,而 COUNT() 不包括。
【解决方案2】:

唉,你不能在 SQL Server 中执行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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多