2017-06-09 3 views
0

おそらくパフォーマンスの問題、または間違っている可能性があります。SQLグループ化の実行回数が複数の列にわたって異なる

TabelA:

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

(にtableAの主キーは、次のとおりです。(studentID、日)

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 

うまくいけば、これは十分なデータ 目標:にtableAの各StudentIdと日付については、

結果が期待される:

(英語)ここでは10
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万行)の最終結果セットを取得できません。ただ走り続けます。

ありがとうございます!

ソリューション:句
TableBのは、すでに(日付、studentID)のインデックスと
を持っていた "順" 削除は、私が(studentId、日付)表B上の別のインデックスを追加しました。
時差:前:> 15分Now:< 30秒

+0

上の潜在的な不足しているインデックスのあなたの実行計画を調べるのでしょうか?それは曖昧です – SouXin

+0

すべての日付がTableBにあるとは限りません。換言すれば、表AにはTableBにはない日付がある。これは、日付20170103の結果セットに表示されます。TableAは、ほぼすべての日をカバーするマスター表です。 –

+0

これはどのように4ですか?あなたの例によると? 1 | 20140102 | 4 –

答えて

0

私はinner join vs cross applyを見ていきます。 tableBは自立しているので、十字適用の代わりに結合を使用します。

select 
    A.studentID, 
    A.date, 
    isnull(B.record_count,0) 
from TableA A 
left join (
    select 
     studentID, 
     date, 
     count(*) as [record_count] 
    from TableB 
    group by 
     studentID, 
     date) B 
    on A.studentID = b.studentID 
    and A.date >= B.date 
group by 
    A.studentID, 
    A.date 
order by 
    A.studentID, 
    A.date 

あなたはまだパフォーマンスの問題が発生した場合は、すべてのテーブルAを必要とする理由は、私がTableBの

+0

これは間違いなく助けになると思います。また、 "order by"節を削除すると、多くの手間がかかります。テスト後に感謝します。 –

+0

ご協力いただきありがとうございます。それはインデックスの問題でした。上記のソリューションが追加されました。 –

+0

また、この回答は明確ではないため、同じ結果を生むことはありません。 –

関連する問題