SQL - группировка с проблемой агрегации двух столбцов - PullRequest
2 голосов
/ 26 января 2011

Моя сегодняшняя проблема в том, что у меня есть таблица с такими строками:

ID NAME NUMBER IDN
1  dsad 500600 12
1  dsad 600700 13
2  kkkk 111222 56
2  kkkk 333232 57

в одном примере ID 1 у меня есть 2 одинаковых имени, 2 разных номера и разные IDN.

То, что я хочу, это извлечь одну строку для каждого идентификатора, где значение idn меньше. Поэтому я хочу что-то подобное

1  dsad  500600 12
2  kkkk  111222 56

Можно ли написать один sql, чтобы получить такой результат? Я пытался сгруппировать это по ID и ИМЯ и иметь мин (IDN), но я застрял в поле номера :) какие-либо идеи?

Ответы [ 3 ]

3 голосов
/ 26 января 2011

Вы были почти там, просто добавьте поле MIN(Number).

SELECT  ID
        , NAME
        , MIN(NUMBER)
        , MIN(IDN)
FROM    ATable
GROUP BY
        ID
        , NAME

В ответ на комментарий

После вы получите записи с MIN(IDN), независимо от того, какой номер для этой конкретной записи.

SELECT  t.*
FROM    ATable t
        INNER JOIN (        
          SELECT  ID, IDN = MIN(IDN)
          FROM    ATable
          GROUP BY ID
        ) tmin ON tmin.ID = t.ID
                  AND tmin.IDN = t.IDN
1 голос
/ 26 января 2011

Версия, которая использует только левое соединение и никаких подзапросов, с SQlite3 и скриптом оболочки, поскольку у меня нет ничего другого под рукой.

#!/bin/sh

rm -f test.sqlite
sqlite3 test.sqlite << AAA
CREATE TABLE test (id int, name text, number int, idn int);
INSERT INTO test VALUES(1,'dsad',500600,12);
INSERT INTO test VALUES(1,'dsad',600700,13);
INSERT INTO test VALUES(2,'kkkk',111222,56);
INSERT INTO test VALUES(2,'kkkk',333232,57);
INSERT INTO test VALUES(1,'dsad',600700,9);
INSERT INTO test VALUES(2,'kkkk',333232,59);
INSERT INTO test VALUES(2,'cccc',333232,59);
SELECT a.* FROM test a
    LEFT JOIN test b ON
            a.id=b.id AND
            a.name=b.name
            AND a.idn > b.idn
            WHERE b.id IS NULL;
AAA
# Result:
# 1|dsad|600700|9
# 2|cccc|333232|59
# 2|kkkk|111222|56

Может кто-нибудь прокомментировать, где производительность лучше? Я думаю, что это тоже важно!

1 голос
/ 26 января 2011
DECLARE @TABLE table (ID int, [NAME] varchar(100),NUMBER int ,IDN int)
insert into @TABLE SELECT 1,'dsad',500600,12
insert into @TABLE SELECT 1,'dsad',600700, 13
insert into @TABLE SELECT 2,'kkkk',111222, 56
insert into @TABLE SELECT 2,'kkkk',333232, 57

select t.ID, t.[Name], t.Number, t.IDN
from (
   select [NAME],min(IDN) as minIDN
   from @TABLE group by [NAME]
) as x inner join @TABLE as t on t.[Name]=x.[Name] and t.IDN = x.minIDN;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...