是否将T-SQL转换为OVER/PARTITION?
我真的不理解t-SQL(2012)OVER和PARTITION BY子句。但我并没有得到另一个我无法理解的解释,而是想知道这是否可以转化为使用OVER?或者其他更简洁的语法是否将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
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合作是我在这个问题上得到的唯一评论,这足以告诉我不要为他们操心