Как я группируюсь минимальным значением в одном поле таблицы, сохраняя все значения от той же самой строки?

У меня есть таблица как это:

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-сервер был бы премией.

8
задан mavnn 30 January 2010 в 11:05
поделиться

2 ответа

Вы должны выполнить это с подзапросами.

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 
13
ответ дан 5 December 2019 в 08:52
поделиться

Как видите, есть решение, которое работает только на стандартном 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

В любом случае, у вас уже есть общее решение, поэтому я просто решил предложить эту альтернативную точку зрения.

6
ответ дан 5 December 2019 в 08:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: