将T-SQL转换为OVER / PARTITION?

时间:2014-07-18 16:09:38

标签: 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 #claims c
            where c.client_id = m.client_id and c.member_id = m.member_id
        ) r1
    )
from #members m

换句话说,我想更新#members中的每条记录,其中包含在唯一日期发生的会员索赔的数量。

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

感谢。

2 个答案:

答案 0 :(得分:1)

我认为你想要一个join而不是窗口函数:

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;

这可能不会更快(或者可能更快)。它更简洁一点。

答案 1 :(得分:0)

不幸的是,窗口函数不适用于DISTINCT。有几种方法可以编写查询。这是一个可能更具可读性的:<​​/ p>

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