Агрегировать функцию SQL, чтобы получить только первое из каждой группы - PullRequest
28 голосов
/ 21 апреля 2009

У меня есть 2 таблицы - таблица учетных записей и таблица пользователей. Каждая учетная запись может иметь несколько пользователей. У меня есть сценарий, в котором я хочу выполнить один запрос / объединение для этих двух таблиц, но мне нужны все данные учетной записи (Account. *) И только набор first пользовательских данных (в частности, их имя) .

Вместо того, чтобы делать "min" или "max" в моей агрегированной группе, я хотел сделать "first". Но, по-видимому, в TSQL нет «первой» агрегатной функции.

Есть предложения о том, как получить этот запрос? Очевидно, что получить декартово произведение Пользователя x легко:

 SELECT User.Name, Account.* FROM Account, User
 WHERE Account.ID = User.Account_ID

Но как мне получить только первого пользователя из продукта, основываясь на порядке его User.ID?

Ответы [ 12 ]

0 голосов
/ 21 апреля 2009

Определите «Первый». То, что вы считаете первым, - это совпадение, которое обычно имеет отношение к порядку кластеризованного индекса, но на него нельзя полагаться (вы можете придумать примеры, которые его нарушают).

Вы вправе не использовать MAX () или MIN (). Соблазняя, рассмотрите сценарий, в котором ваше имя и фамилия находятся в отдельных полях. Вы можете получить имена из разных записей.

Так как все, что вас действительно волнует, так это то, что вы получаете ровно одну произвольную запись для каждой группы, вы можете просто MIN или MAX поле идентификатора для этой записи, а затем присоединить таблицу к запросу по этому идентификатору .

0 голосов
/ 21 апреля 2009

Есть несколько способов сделать это, здесь быстрый и грязный.

Select (SELECT TOP 1 U.Name FROM Users U WHERE U.Account_ID = A.ID) AS "Name,
    A.*
FROM Account A
...