HI все, У меня возникли некоторые трудности с пониманием обоснования группы путем объединения в SQL Server 2005.SQL группа по п пониманию (простой вопрос/SQL сервер 2005)
У меня есть следующий запрос, который отлично работает и возвращает одну строку для каждого contact.id и 1-й вхождение события
SELECT
contact.id
,MIN(eve.date_created)
FROM _contact contact WITH(nolock)
INNER JOIN table2 tb2 WITH (nolock) ON contact.id = tb2.id1
INNER JOIN _event eve WITH (nolock) ON tb2.id2 = eve.id
INNER JOIN _cashtable cash WITH (nolock) ON cash.contact_id = contact.id
GROUP BY contact.id
Однако то, что я ищу, чтобы иметь следующий запрос и еще только вытащить одну строку за contact.id
SELECT
contact.id
,MIN(eve.date_created)
,cash.id2 -- the cash linked to the first event
,eve.id -- the first event linked to the contact
FROM _contact contact with (nolock)
INNER JOIN _table2 tb2 WITH (nolock) ON contact.id = tb2.id1
INNER JOIN _event eve WITH (nolock) ON tb2.id2 = eve.id
INNER JOIN _cashtable cash WITH (nolock) ON cash.contact_id = contact.id
GROUP BY contact.id
Я получаю стандартное сообщение об ошибке, говорящее, что мне нужно добавить cash.id2 и eve.id в предложение group by, которое возвращает результаты, которые я не хочу.
Я знаю, что есть потенциальные варианты использования ранга()/секционирования или даже включая
select(MIN(eve.date_created)
в предложении FROM, но я не уверен, что было бы лучше, чтобы поставить это и я все еще довольно запутанным относительно того, почему SQL требует, чтобы все было включено в группу по заявлению, и поэтому любые советы были бы замечательными :)
Заранее благодарен!
Спасибо за это, я предполагаю, что внутреннее соединение (select id, date_created на самом деле выбирает MIN (date_created)?) При использовании этого он возвращает много строк на contact_id (около 50) вместо одного, есть ли какие-либо причина для этого? (в случае, если он помогает использовать выделение отдельных половинок числа строк, возвращаемых примерно до 25 на контакт) – Dibstar
да, вы правы, я должен был применить функцию min() к date_created. Если это возвращает больше чем одна строка, тогда он получает оставшиеся строки из события, если для одного и того же min_created или наличных денег есть более одного, если на каждый идентификатор есть несколько строк. – Beth