SQL - 由两列聚合组成的问题

时间:2011-01-26 09:59:35

标签: c# .net sql oracle

我今天的问题是我有一个像这样的行的表:

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值较小的每个Id。 所以我希望有类似的东西

1  dsad  500600 12
2  kkkk  111222 56

编写单个sql以获得该结果是否可行?我试图通过ID和NAME对其进行分组并获得最小值(IDN)但我仍然坚持使用数字字段:)任何想法?

3 个答案:

答案 0 :(得分:3)

你几乎就在那里,只需添加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 :(得分:1)

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;

答案 2 :(得分:1)

只使用左连接而没有子查询的版本,使用SQlite3和shell脚本,因为我没有任何其他手头ATM:

#!/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

有人可以评论性能更好的地方吗?我认为这也很重要!