sql-根据group by从行中获取id

sql-根据group by从行中获取id,sql,group-by,Sql,Group By,表A 食疗 投标书 等级 表B 投标书 名字 描述 表A从两个表中的tableBID链接到表b 如果我想在表A中为表B中的每一行找到级别最高的行,我会这样编写查询: select max(grade) from TableA group by tableBID 但是,我不只是想要成绩,我想要成绩加上那一行的id。假设你只有一个Max()(巨大的假设),你可以做min(tableaid),其中grade=(选择Max(grade)等…) 或者如果您想要所有匹配的ID SELECT Tab

表A

  • 食疗
  • 投标书
  • 等级
表B

  • 投标书
  • 名字
  • 描述
表A从两个表中的tableBID链接到表b

如果我想在表A中为表B中的每一行找到级别最高的行,我会这样编写查询:

select max(grade) from TableA group by tableBID

但是,我不只是想要成绩,我想要成绩加上那一行的id。

假设你只有一个Max()(巨大的假设),你可以做min(tableaid),其中grade=(选择Max(grade)等…)

或者如果您想要所有匹配的ID

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

你可以试试类似的东西

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
使用SQLServer2005函数,您还可以尝试

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

只需使用一点自引用NOT EXISTS子句:

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)