Новичок ищет помощи, Макс Агрегат не возвращает ожидаемых результатов - PullRequest
0 голосов
/ 10 сентября 2018

Я все еще очень плохо знаком с MS-SQL. У меня есть простая таблица и запрос, который получает лучшее из меня. Я знаю, что это будет что-то фундаментальное, что я пропускаю.

Я изменил имена полей, но идея та же. Таким образом, идея заключается в том, что каждый раз, когда кто-то регистрируется, он получает RegID, Имя и Команду. Имена уникальны, так что ниже да Джон сменил команды. И это моя проблема.

            Football Table
+------------+----------+---------+
| Max_RegID  |   Name   |   Team  |
+------------+----------+---------+
|   100      |   John   |   Red   |
|   101      |   Bill   |   Blue  |
|   102      |   Tom    |   Green |
|   103      |   John   |   Green |
+------------+----------+---------+

С запросом внизу, используя Max_RegID, я ожидал получить только одну запись.

+------------+----------+---------+
| Max_RegID  |   Name   |   Team  |
+------------+----------+---------+
|   103      |   John   |   Green |
+------------+----------+---------+

Вместо этого я возвращаюсь ниже, который, кажется, включает Max_RegID, но также для каждой команды. Что я делаю не так?

+------------+----------+---------+
| Max_RegID  |   Name   |   Team  |
+------------+----------+---------+
|   100      |   John   |   Red   |
|   103      |   John   |   Green |
+------------+----------+---------+

Мой запрос

SELECT
  Max(Football.RegID) AS Max_RegID,
  Football.Name,
  Football.Team
FROM
  Football    
GROUP BY
  Football.RegID,
  Football.Name,
  Football.Team

РЕДАКТИРОВАТЬ * Удален оператор WHERE

Ответы [ 4 ]

0 голосов
/ 10 сентября 2018

Причина, по которой вы получаете результаты, кроется в том, как структурировано ваше предложение GROUP BY.

Когда вы используете какую-либо статистическую функцию, MAX(X), SUM(X), COUNT(X), или что у вас есть, вы сообщаете механизму SQL, что вам нужно совокупное значение столбца X для каждой уникальной комбинации столбцов, перечисленных в предложении GROUP BY.

В вашем запросекак написано, вы группируете по всем трем столбцам таблицы, сообщая механизму SQL, что каждый кортеж уникален.Поэтому запрос возвращает ВСЕ значения, а вы вообще ничего не получаете MAX.

То, что вы действительно хотите в своих результатах, - это максимальный RegID для каждого отдельного значения в Name столбец, а также Team, который сочетается с этой (RegID, Name) комбинацией.

Для этого вам нужно найти MAX(ID) для каждого Name в исходном наборе данных, а затем использовать этот список из RegID s, чтобы добавить значения для Name и Teamво вторичном наборе данных.

Предостережение (по комментариям @HABO): Предполагается, что RegID является уникальным числом (столбец IDENTITY, значение из SEQUENCE или что-тотакого рода).Если есть повторяющиеся значения, это не удастся.

Самый простой способ сделать это с помощью подзапроса.Подзапрос ниже получает ваши уникальные RegID s, а затем присоединяется к исходной таблице, чтобы добавить другие значения.

SELECT
  f.RegID
 ,f.Name
 ,f.Team
FROM
  Football AS f
  JOIN
    (--The sub-query, sq, gets the list of IDs
      SELECT
        MAX(f2.RegID) AS Max_RegID
      FROM
        Football AS f2
      GROUP BY
        f2.Name
    ) AS sq
      ON
      sq.Max_RegID = f.RegID;

EDIT: Извините.Я просто перечитал вопрос.Чтобы получить только одну запись для MAX(RegID), просто выньте GROUP BY из подзапроса, и вы просто получите текущее максимальное значение, которое вы можете использовать, чтобы найти значения в остальных столбцах.

SELECT
  f.RegID
 ,f.Name
 ,f.Team
FROM
  Football AS f
  JOIN
    (--The sub-query, sq, now gets the MAX ID
      SELECT
        MAX(f2.RegID) AS Max_RegID
      FROM
        Football AS f2
    ) AS sq
      ON
      sq.Max_RegID = f.RegID;
0 голосов
/ 10 сентября 2018

Вам нужно self присоединиться:

select f1.*
from Football f inner join
     Football f1 
     on f1.name = f.name
where f.Max_RegID = 103;

После повторного посещения вопроса выборочные данные подсказывают мне подзапрос:

select f.*
from Football f
where name = (select top (1) f1.name
              from Football f1
              order by f1.Max_RegID desc
             );
0 голосов
/ 10 сентября 2018

просто вы можете отредактировать ваш запрос следующим образом

SELECT *      
FROM
  Football f
WHERE
  f.Name = 'John' and 
 Max_RegID = (SELECT  Max(Football.Max_RegID) where Football.Name = 'John'
         )

или если SQL Server просто использовать это

select top 1 * from Football f
where f.Name = 'John'
order by Max_RegID desc

или если mysql, то

select  * from Football f
    where f.Name = 'John'
    order by Max_RegID desc
Limit 1
0 голосов
/ 10 сентября 2018

Использовать row_number ()

    select * from 
(SELECT
      Football.RegID AS Max_RegID,
      Football.Name,
      Football.Team, row_number() over(partition by name order by Football.RegID desc) as rn
    FROM
      Football
    WHERE
      Football.Name = 'John')a
where rn=1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...