SQL分组在多个列上的不同运行计数

时间:2017-06-09 17:24:42

标签: sql-server query-performance

可能是性能问题,或者是错误的。

TabelA:

StudentID | Date  
----------|------  
1         | 20140101  
1         | 20140102  
1         | 20170103  
2         | 20140101  
2         | 20170103  
3         | 20140101  
3         | 20170103  
3         | 20170104  

(tableA的主键是:(studentID,Date)

TableB:  
StudentID|Date     |Class   | Warning | Instructor  
---------|---------|--------|---------|-----------  
1        |20140101 |History |Tardy    | Mr.H  
1        |20140101 |History |Homework | Mr.H  
1        |20140101 |Biology |Tardy    | Mr.B 
1        |20140102 |Biology |Homework | Mr.B   
1        |20140102 |History |Tardy    | Mr.H  
2        |20140101 |Math    |Test     | Mr.M 
2        |20140101 |Art     |Test     | Mr.A 
3        |20140101 |History |Tardy    | Mr.H  
3        |20170103 |History |Tardy    | Mr.H

希望这是足够的数据。 目标:对于表A中的每个StudentId和日期,在表A中的指定日期之前获取不同(类,警告,指导者)的计数。

预期结果:

StudentID | Date    | Count  
----------|---------|--------  
1         |20140101 |3        
1         |20140102 |4       
1         |20170103 |4  
2         |20140101 |2  
2         |20170103 |2        
3         |20140101 |1         
3         |20170103 |1  
3         |20170104 |1  

这就是我所拥有的:

select A.studentID, A.date, count(1)
from TableA A
cross apply (select distinct B.class,B.warning,B.instructor
             from TableB B
             where A.studentID = B.studentID
               and B.date <= A.date) Z
group by A.studentID, A.date
order by A.studentID, A.date

对于大型数据集,是否有更好/替代的方法来实现此结果? 问题:我无法获得大数据集(100万行)的最终结果集。它一直在运行。

谢谢!

解决方案: 删除了“order by”条款
TableB已经有(date,studentID)和
的索引 我在表B上添加了另一个索引(studentId,date) 时差:之前:&gt; 15分钟现在:&lt; 30秒

1 个答案:

答案 0 :(得分:0)

我会看看inner join vs cross apply。由于tableB是自给自足的,我会使用连接而不是交叉应用。

ObjConfig.MyValue

如果您仍遇到性能问题,我会检查您在TableB上潜在缺失索引的执行计划