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

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

Field1 | Field2 | Field3
1      | 1      | 22
1      | 2      | 10
2      | 5      | 40
2      | 2      | 55

Я хочу сгруппировать по полю1, а затем взять значения из остальной части строки с минимальным значением поля2, например:

Field1 | Field2 | Field3
1      | 1      | 22
2      | 2      | 55

Обратите внимание, что это не то же самое, что выбор минимума каждой строки, что даст:

Field1 | Field2 | Field3
1      | 1      | 10
2      | 2      | 40

Что с моими данными было бы бессмысленным результатом.

У кого-нибудь есть общее (т. Е. Мультибазы данных) решение для этого? Я уверен, что это должна быть решенная проблема!

Я действительно мог бы сделать с решением, которое работает как в sqlite, так и в ms-access, и sql server был бы бонусом.

Ответы [ 2 ]

13 голосов
/ 30 января 2010

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

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

Теперь, если у вас есть несколько строк для минимального значения field2, тогда у вас будут дуплексы ... Если вы не хотите этого (то есть вы хотите минимальное значение field3 для каждого минимального значения field2) в этом В этом случае вам потребуется другой подзапрос:

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 
6 голосов
/ 30 января 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...