У меня есть таблица как это:
Field1 | Field2 | Field3
1 | 1 | 22
1 | 2 | 10
2 | 5 | 40
2 | 2 | 55
Я хочу сгруппироваться Field1 и затем принять значения от остальной части строки с минимальным Field2, например:
Field1 | Field2 | Field3
1 | 1 | 22
2 | 2 | 55
Обратите внимание, что это не то же как выбор минимума каждой строки, которая дала бы:
Field1 | Field2 | Field3
1 | 1 | 10
2 | 2 | 40
Который с моими данными был бы бессмысленным результатом.
У кого-либо есть генерал (т.е. много база данных) решением этого? Я уверен, что это должна быть решенная проблема!
Я мог действительно сделать с решением, которое работает и в sqlite и в доступе мс, и SQL-сервер был бы премией.
Вы должны выполнить это с подзапросами.
Select * from
yourtable t
inner join
( Select field1, min(field2) as minField2
from yourtable
group by field1
) xx
on t.field1 = xx.field1 and t.field2 = xx.minfield2
Теперь, если у вас несколько строк для минимального значения поля2, то у вас будут дубликаты... Если вы этого не хотите (т.е. вам нужно минимальное значение поля3 для каждого минимального значения поля2), то вам понадобится еще один подзапрос:
Select outert.field1, outert.field2, outert.field3
from yourtable outert
inner join
(
Select t.field1, xx.minfield2, min(field3) as minfield3 from
yourtable t
inner join
( Select field1, min(field2) as minField2
from yourtable
group by field1
) xx
on t.field1 = xx.field1 and t.field2 = xx.minfield2
group by t.field1, xx.minfield2
) outerx
on outerx.field1 = outert.field1
and outerx.field2 = outert.minfield2
and outerx.field3 = outert.minfield3
Как видите, есть решение, которое работает только на стандартном SQL, но оно длинное и сложное.
Обратите внимание, что также можно написать программу "Привет, мир!", которая корректно работает на трех различных языках программирования. Однако, как правило, это не приносит никакой пользы вашей программе. Гораздо проще просто написать программу три раза, с учетом специфического синтаксиса каждого языка.
Я думаю, что с SQL часто лучше забыть о попытках найти решение, которое работает во всей СУБД и использовать специфические расширения и идиомы производителя, которые облегчают такие запросы. Например, в MS SQL Server можно сделать нечто подобное:
SELECT Field1, Field2, Field3
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY field1 ORDER BY field2) AS rn
FROM table1
) AS T1
WHERE rn = 1
В любом случае, у вас уже есть общее решение, поэтому я просто решил предложить эту альтернативную точку зрения.