是否将T-SQL转换为OVER/PARTITION?

是否将T-SQL转换为OVER/PARTITION?,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我真的不理解t-SQL(2012)OVER和PARTITION BY子句。但我并没有得到另一个我无法理解的解释,而是想知道这是否可以转化为使用OVER?或者其他更简洁的语法 update m set unique_count = ( select count(*) from ( select distinct client_id, member_id, claim_begin_dt from #cla

我真的不理解t-SQL(2012)OVER和PARTITION BY子句。但我并没有得到另一个我无法理解的解释,而是想知道这是否可以转化为使用OVER?或者其他更简洁的语法

update m
    set unique_count =
    (
        select count(*) from
        (
            select distinct client_id, member_id, claim_begin_dt
            from #claims c
            where c.client_id = m.client_id and c.member_id = m.member_id
        ) r1
    )
from #members m
换句话说,我想用在唯一日期发生的成员声明计数更新#members中的每个记录

顺便说一下,如果上面有语法错误,请忽略它(如果可能)。这段代码是从works中复制的,但我更改了一些名称和内容以使其更清晰

谢谢


Dan

我想你想要的是一个
连接
而不是窗口函数:

update m
    set unique_count = c.cnt
    from #members m join
         (select client_id, member_id, count(distinct claim_begin_dt) as cnt
          from #claims c
          group by client_id, member_id
         ) c
         on c.client_id = m.client_id and c.member_id = m.member_id;

这可能不会更快(也可能更快)。更简洁一点。

不幸的是,窗口功能不能与DISTINCT一起工作。有几种方法可以编写查询。这里有一个可能更具可读性:

update m
    set unique_count =
    (
        select count(*) from
        (
            select distinct client_id, member_id, claim_begin_dt
            from #claims c
            where c.client_id = m.client_id and c.member_id = m.member_id
        ) r1
    )
from #members m
UPDATE m
  SET unique_count = c.unique_count
FROM #members m
CROSS APPLY (
  SELECT
    COUNT(DISTINCT claim_begin_dt) unique_count
  FROM m
  WHERE client_id = m.client_id and member_id = m.member_id
) c

谢谢实际上我更喜欢我使用的语法。我想更清楚的是加入。哈哈-这只是一个偏好的问题。“问任何5个程序员…”我选择这个作为答案,不是因为SQL示例,而是因为让我知道窗口函数不能与distinct一起工作。谢谢你。@DanThomas。考虑到窗口函数不适合这个问题,窗口函数不适用于distinct似乎无关紧要。我理解你的意思。然而,我不知道窗口函数不适合这种情况。例如,你在回答中没有这样说。然而,知道他们不会与DISTINCT合作是我在这个问题上得到的唯一评论,这足以告诉我不要为他们操心