sql - получение идентификатора из строки на основе группы - PullRequest
3 голосов
/ 07 апреля 2010

Таблица A

  • tableAID
  • tableBID
  • класс

Таблица B

  • tableBID
  • имя
  • описание

Таблица A ссылается на таблицу b из таблицы BID, найденной в обеих таблицах.

Если я хочу найти строку в таблице A, которая имеет наивысшую оценку, для каждой строки в таблице B, я бы написал свой запрос следующим образом:

select max(grade) from TableA group by tableBID

Однако я не просто хочу оценку, я хочу оценку плюс идентификатор этой строки.

Ответы [ 3 ]

4 голосов
/ 07 апреля 2010

Вы можете попробовать что-то вроде

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

Используя функцию Sql Server 2005 ROW_NUMBER , вы также можете попробовать

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 голосов
/ 07 апреля 2010

Просто используйте небольшое самоотносительное предложение НЕ СУЩЕСТВУЕТ:

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)
0 голосов
/ 07 апреля 2010

Предполагая, что у вас будет только один Макс () (ОГРОМНОЕ ПОЛОЖЕНИЕ), вы можете сделать мин. (Указание в таблице), где оценка = (выбрать максимальную (оценку) и т. Д ....)

или, если вы хотите, чтобы все соответствующие идентификаторы

SELECT TableAID, Grade
FROM TableA INNER JOIN (SELECT  tableBID,
     MAX(grade) Grade
     FROM    TableA
     GROUP BY tableBID) MaxGrade 
ON TableA.Grade = MaxGrade.Grade 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...