如何使用TSQL无需子查询统计员工的唯一岗位变更次数?
实现方法(无需子查询)
当然可以!咱完全能用TSQL的窗口函数搞定这个需求,根本不需要子查询。结合你给的样例,先明确核心需求:每个员工的jobcount是他经历的岗位变更总次数(包括切换回原岗位的情况)——比如tim三次变更(哪怕有重复岗位)就显示3,joy两次都是同一岗位没切换就显示1,rob四次不同岗位切换就显示4。
直接上可用的TSQL代码:
SELECT name, job, -- 统计员工的岗位变更次数(相邻岗位不同的次数)+1,得到总状态数 COUNT(CASE WHEN job <> LAG(job) OVER (PARTITION BY name ORDER BY (SELECT NULL)) THEN 1 END) OVER (PARTITION BY name) + 1 AS jobcount FROM YourTableName; -- 替换成你的实际表名
代码细节解释:
LAG(job) OVER (PARTITION BY name ORDER BY (SELECT NULL)):这个窗口函数会拉取当前员工上一条记录的岗位。这里用ORDER BY (SELECT NULL)是因为你的原始数据没提供时间字段,只能按现有顺序处理;如果你的表有变更时间(比如change_date),一定要换成这个字段排序,结果才会准确!CASE WHEN job <> LAG(...) THEN 1 END:当当前岗位和上一次不一样时,标记为1,代表一次有效变更。COUNT(...) OVER (PARTITION BY name):统计每个员工的总变更次数。- 最后加1是因为要把初始的岗位状态算进去,这样得到的数值就和你给出的样例完全匹配了。
补充:如果需求是统计不同岗位的数量
要是你其实想统计每个员工有多少个不同的岗位(比如tim是2,joy是1,rob是4),那代码更简单:
SELECT name, job, COUNT(DISTINCT job) OVER (PARTITION BY name) AS jobcount FROM YourTableName;
内容的提问来源于stack exchange,提问作者R.Merritt
相关产品推荐
相关产品推荐

