У меня (кажется, есть) очень простая проблема, но после поиска часов я не могу найти ничего полезного.Как выбрать только одну полную строку для каждой группы в запросе «group by»?
Вот проблема:
В Microsoft SQL, у меня есть таблица, где столбец A хранит некоторые данные. Эти данные могут содержать дубликаты (т. Е. Две или более строк будут иметь одинаковое значение для столбца A).
я могу легко найти дубликаты by doing:
select A, count(A) as CountDuplicates
from TableName
group by A having (count(A) > 1)
Теперь я хочу, чтобы получить значения других столбцов, скажем B и C. Конечно, значения B и C могут быть разными даже для строк, имеющих одинаковое значение A, но для меня это не имеет значения. Я просто хочу любой B значение и любые C один, первый, последний или случайный.
Если у меня был небольшой стол и один или два столбца, чтобы восстановить, я хотел бы сделать что-то вроде:
select A, count(A) as CountDuplicates, (
select top 1 child.B from TableName as child where child.A = base.A) as B
)
from TableName as base group by A having (count(A) > 1)
Проблема в том, что у меня есть гораздо больше строк, чтобы получить, и таблица довольно большой, поэтому выбор нескольких детей будет иметь высокую производительность.
Итак, есть ли менее уродливое чистое решение SQL для этого?
Не уверен, что, если мой вопрос достаточно ясно, поэтому я приведу пример, основанный на AdventureWorks базы данных. Предположим, я хочу перечислить доступные государства и для каждого государства получить свой код, город (любой город) и адрес (любой адрес). Самый простой и самый неэффективный способ сделать это будет:
var q = from c in data.StateProvinces select new { c.StateProvinceCode, c.Addresses.First().City, c.Addresses.First().AddressLine1 };
в LINQ к SQL и будет делать два выбирает для каждого из 181 государств, поэтому 363 выбирает. В моем случае я ищу способ иметь максимум 182 выбора.
Downvote - Я думаю, ты виноват в том, что стреляешь в ответ, чтобы быть первым. Очевидно, вы не тестировали этот код, так как он говорит «form» и «innet join». Кроме того, тот факт, что он полагается на A, является уникальным ключом (но не первичным ключом, как вы сказали), делает его плохим общим решением. –
ans обновлено сейчас ... спасибо за информацию –