0

私はこのクエリを持っています:

SELECT TOP 1 A.ExamTemplateId, A.Id AS AnsweredTestId, AVG(B.Score) AS AvgScore, A.[Date]
FROM AnsweredTest AS A
INNER JOIN AnsweredWorksheet AS B ON (A.Id = B.AnsweredTestId)
WHERE A.StudentId = 'OPA-3DKCL2' AND A.ExamTemplateId = 1
GROUP BY A.Id, A.ExamTemplateId, A.[Date]
ORDER BY AvgScore DESC

WHERE静的な番号を受け取る条件があることを確認してください。クエリ結果は次のとおりです。

例1

例2 ここに画像の説明を入力してください

そしてそれは正しいです!しかし、ここで、ExamTemplateテーブルのすべてのレコードを表示したいと思います。しかし、今はどうすればそれを達成できるのかわかりません。関数を作成しようと思っていたのですが、よくわかりません。ただのアイデアです。

私が受け取りたい最終的な出力は、最後のレコードの結合です。

1   1   0.7 2012-10-21 19:50:11.697
2   10  0.555555555555556   2012-10-22 18:58:24.163

前もって感謝します。

アップデート:

興味のある行を黄色で強調表示しています。TOP 1で最高の平均スコアを取得したいので、最後のクエリで設定しましたExamTemplateId。そして、それがすべてになります。

ここに画像の説明を入力してください

4

3 に答える 3

3

A.ExamTemplateId = 1を値のリストに置き換えたいようです。もしそうなら、あなたは次のようなものを使うことができるはずです:

SELECT A.ExamTemplateId, 
  A.Id AS AnsweredTestId, 
  AVG(B.Score) AS AvgScore, 
  A.[Date]
FROM AnsweredTest AS A
INNER JOIN AnsweredWorksheet AS B 
  ON (A.Id = B.AnsweredTestId)
WHERE A.StudentId = 'OPA-3DKCL2' 
  AND A.ExamTemplateId IN (SELECT ExamTemplateId -- use a SELECT statement to get all template id
                           FROM ExamTemplateTable)
GROUP BY A.Id, A.ExamTemplateId, A.[Date]
ORDER BY AvgScore DESC

値が1つだけ必要な場合は、次のように使用できます。

select ExamTemplateId,
    AnsweredTestId,
    AvgScore,
    [Date]
from 
(
  select ExamTemplateId,
    AnsweredTestId,
    AvgScore,
    [Date],
    row_number() over(partition by ExamTemplateId order by AvgScore) rn
  from
  (
    SELECT A.ExamTemplateId, 
      A.Id AS AnsweredTestId, 
      AVG(B.Score) AS AvgScore, 
      A.[Date]
    FROM AnsweredTest AS A
    INNER JOIN AnsweredWorksheet AS B 
      ON (A.Id = B.AnsweredTestId)
    WHERE A.StudentId = 'OPA-3DKCL2' 
      AND A.ExamTemplateId IN (SELECT ExamTemplateId -- use a SELECT statement to get all template id
                               FROM ExamTemplateTable)
    GROUP BY A.Id, A.ExamTemplateId, A.[Date]
  ) sc
) mx
where rn = 1
于 2012-10-26T18:54:36.720 に答える
1

によるパーティションを使用します。

With t AS (
    SELECT A.ExamTemplateId, A.Id AS AnsweredTestId, AVG(B.Score) AS AvgScore, A.[Date] 
    FROM AnsweredTest AS A
    INNER JOIN AnsweredWorksheet AS B ON (A.Id = B.AnsweredTestId)
    WHERE A.StudentId = 'OPA-3DKCL2' --AND A.ExamTemplateId in (...)
    GROUP BY A.Id, A.ExamTemplateId, A.[Date]
)
, w AS (
    SELECT *, 
        ROW_NUMBER() OVER (PARTITION BY ExamTemplateId ORDER BY AvgScore DESC) rank
    FROM t 
)
SELECT * FROM w 
WHERE rank = 1
于 2012-10-26T19:54:10.300 に答える
0

最初はすべての学生に会いたいと思っていましたが、すべての試験テンプレートが必要だと思います。上位1つのフィルターを削除して、試験テンプレートをどこからでも取り出せない理由は何ですか。平均は、私があなたが望むものだと思う試験ごとのテンプレートで計算されます。

SELECT A.ExamTemplateId, A.Id AS AnsweredTestId, AVG(B.Score) AS AvgScore, A.[Date]
FROM AnsweredTest AS A
INNER JOIN AnsweredWorksheet AS B ON (A.Id = B.AnsweredTestId)
WHERE A.StudentId = 'OPA-3DKCL2' 
GROUP BY A.Id, A.ExamTemplateId, A.[Date]
ORDER BY AvgScore DESC`
于 2012-10-26T18:58:04.390 に答える