2009-02-25 20 views
1

Öğrencilerin bir listesini ilişkilendirici işaretleriyle sorgulayacak bir Kayıtlı Yordam yazarken zorluk yaşıyorum. Öğrenci başına ilk beş işaretleri alınıyor önemsiz - - Öğrenci Listesini alınıyorSQL: Kullanıcı Başına TOP N İşaretini Seç (Bir Kullanıcı Listesinde)

önemsiz ... SEÇ TOP (5) * StudentID = X

bu ikisini birleştiren, biraz karıştı.

    bir kritere göre
  • İkinci tablo öğrenciler sıralanır
  • İlk tablo: (İlk Tablo öğrenci başına 5 adet) notlarının bir listesi
  • İki tablo dönmek saklı yordam istiyorum

İkinci tablo, zor olduğunda. İlk Tablodaki öğrenci başına tüm işaretleri alabilirim ancak bunu nasıl en üst düzeye çıkarabileceğimi bilmiyorum.

cevap

1

SQL 2005 veya daha yeni kullanıyorsanız, bu işe yaramalıdır. Değilse, bunu yapmak için biraz daha karışık yollar vardır.

WITH Student_Grades AS 
(
    SELECT 
     S.student_id, 
     G.grade, 
     RANK() OVER (PARTITION BY S.student_id, ORDER BY G.exam_date DESC) AS grade_rank 
    FROM 
     Students S 
    LEFT OUTER JOIN Grades G ON 
     G.student_id = S.student_id 
) 
SELECT 
    student_id, 
    grade 
FROM 
    Student_Grades 
WHERE 
    grade_rank <= 5 
1

2 sonuç kümesini döndüren saklı yordamlardan kaçınmaya çalışın. Bu 2 ayrı prosedürü yapın.

Bir sıralama düzeni belirtmezseniz, TOP 5, rastgele satırları döndürür. Sınıfa göre sıralamak istediğinizi varsayalım. Üst sınıfların hepsinin aynı olması durumunda bazı ek sıralama kriterlerine ihtiyacınız olacaktır. Örneğin, en yeni en iyi 5 notu geri alabilirsin.

2. prosedürünüzün öğrenci başına en iyi 5 notu döndürmesi için, RANK deyiminin sözdizimine bakın.

+0

Neden birden fazla Sonuç Kümesi döndürmemeliyim? Ya da diğer iki kayıtlı proaksiyonu çağıran bir Kayıtlı Proc gibi bir şey olmalı ... Sadece mantığı anlamak istiyorum .. :) – TimLeung

+0

A. Teknik olarak mümkün olsa da, bu biraz sıradışı ve yapar Kodunuza bakmakta olan biri için anlamak zor. B. Çünkü diğer veritabanları (Orcale) bunu yapamaz. – cdonner

İlgili konular