我今天的问题是我有一个像这样的行的表:
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)但我仍然坚持使用数字字段:)任何想法?
答案 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
有人可以评论性能更好的地方吗?我认为这也很重要!