2010-04-06 7 views
2

Tableau ASQL - obtenir l'ID d'une ligne à base d'un groupe par

  • tableAID
  • tableBID
  • qualité

Tableau B

  • tableBID
  • Nom
  • Description

Tableau A des liens vers le tableau b de la tableBID trouvés dans les deux tableaux.

Si je veux trouver la ligne dans le tableau A, qui a le grade le plus élevé, pour chaque ligne dans le tableau B, je voudrais écrire ma requête comme ceci:

select max(grade) from TableA group by tableBID 

Cependant, je ne suis pas seulement Je veux la note, je veux la note plus l'ID de cette rangée.

Répondre

2

vous pouvez essayer quelque chose comme

SELECT a.* 
FROM TableA a INNER JOIN 
     (
      SELECT tableBID, 
        MAX(grade) MaxGrade 
      FROM TableA 
      GROUP BY tableBID 
     ) B ON a.tableBID = B.tableBID AND a.grade = B.MaxGrade 

Utilisation de la fonction Sql Server 2005 ROW_NUMBER vous pouvez également essayer

SELECT tableAID, 
     tableBID, 
     grade 
FROM (
      SELECT *, 
        ROW_NUMBER() OVER (PARTITION BY tableBID ORDER BY grade DESC) RowNum 
      FROM @TableA 
     ) A 
WHERE a.RowNum = 1 
0

En supposant que vous n'aurez un Max() (de ASSOMPTION énorme) vous pouvez faire min (tableaid) où = année (select max (grade) etc ....)

ou si vous voulez que tous les IDs correspondant

SELECT TableAID, Grade 
FROM TableA INNER JOIN (SELECT tableBID, 
    MAX(grade) Grade 
    FROM TableA 
    GROUP BY tableBID) MaxGrade 
ON TableA.Grade = MaxGrade.Grade 
0

Il suffit d'utiliser un peu d'auto-référencement EXISTE clause NOT:

DECLARE @tableA TABLE (tableAID int IDENTITY(1,1), tableBID int, grade int) 

INSERT INTO @tableA(tableBID, grade) VALUES(10, 1) 
INSERT INTO @tableA(tableBID, grade) VALUES(10, 3) 
INSERT INTO @tableA(tableBID, grade) VALUES(20, 4) 
INSERT INTO @tableA(tableBID, grade) VALUES(20, 8) 
INSERT INTO @tableA(tableBID, grade) VALUES(30, 10) 
INSERT INTO @tableA(tableBID, grade) VALUES(30, 6) 

SELECT tableAID, grade 
FROM @tableA ta 
WHERE NOT EXISTS (SELECT 1 FROM @tableA WHERE tableBID = ta.tableBID AND grade > ta.grade)