Sql 从分组依据中仅选择一行?
我使用的是Microsoft Access 2010,我有一个表Sql 从分组依据中仅选择一行?,sql,database,ms-access-2010,Sql,Database,Ms Access 2010,我使用的是Microsoft Access 2010,我有一个表T\u提供,如下所示: Key ID Date Name Text --- -- ---------- ----------- ----------- 1 10 10/10/2015 Lorem Consectetur 2 10 10/10/2015 Ipsum Amet 3
T\u提供
,如下所示:
Key ID Date Name Text
--- -- ---------- ----------- -----------
1 10 10/10/2015 Lorem Consectetur
2 10 10/10/2015 Ipsum Amet
3 11 27/09/2014 Dolor Sit
4 13 12/11/2013 Sit Dolor
5 14 11/07/2015 Amet Ipsum
6 14 12/07/2015 Consectetur Lorem
我只需要获得每个ID的一行(日期最小的一行),因此,例如,此表的结果将是:
Key ID Date Name Text
--- -- ---------- ----------- -----------
1 10 10/10/2015 Lorem Consectetur
3 11 27/09/2014 Dolor Sit
4 13 12/11/2013 Sit Dolor
5 14 11/07/2015 Amet Ipsum
这是我尝试过的查询之一:
SELECT ID, name, text, MIN (date) AS minDate
FROM (SELECT ID, name, text, date
FROM T_Offers
GROUP BY ID, name, text, date
ORDER BY ID asc) as X
GROUP BY ID, name, text
这可以正常工作,但有一个小问题:如果两个具有相同ID的报价具有相同的日期,结果表将重复ID,我不希望发生这种情况。有解决此问题的其他方法吗?假设ID不重复,以下是在Access中执行此操作的一种方法:
select o.*
from t_offers as o
where o.key = (select min(o2.key)
from t_offers as o2
where o2.id = o.id
);
您需要一个select distinct查询:
SELECT DISTINCT ID, name, text, MIN (date) AS minDate
FROM T_Offers
GROUP BY ID, name, text
ORDER BY ID asc;
您可以使用
不存在
排除存在具有相同ID和较早日期的另一行的所有行:
SELECT t1.Key, t1.ID, t1.Date, t1.Name, t1.Text
FROM t_offers AS t1
WHERE NOT EXISTS
( SELECT 1
FROM T_Offers AS t2
WHERE t2.ID = t1.ID
AND t2.Date < t1.Date
);
这是我的解决方案。虽然我的测试环境是mysql,但sql语法是相同的
SELECT TO1.KEY,TO1.ID,TO.DATE,TO1.NAME,TO1.TEXT
FROM T_Offer TO1
INNER JOIN
(
select MIN(TO2.KEY) AS KEY from T_Offer TO2 group by ID
)TO3
ON TO1.KEY = TO3.KEY
建议:如果方便的话,我可以帮助您提供创建表和插入测试数据的脚本。如果我刚才提问,很抱歉,我忘了在问题中包括这一点:有没有办法只选择每个id的一条记录,但选择日期最短的记录?@MattiaNocerino。根据问题中的数据,看起来
键
是唯一的,因此每个id只会选择一条记录。这与我已经尝试过的内容非常相似,并且给出了相同的问题:如果有两个具有相同id和相同日期的报价,如果它们具有相同的id、名称、文本和日期,我将不会得到不同的id,distinct将删除重复的行。但如果你有相同的身份证,相同的日期,但不同的名字或文字,它不会。在这种情况下,您希望查询如何响应?如果您不关心所有不同的名称和文本的显示,只需不按它们分组:选择不同的ID、name、text、MIN(日期)作为minDate FROM t_提供按ID分组按ID排序asc代码>这是答案,谢谢(无论如何,我认为子查询条件t2.ID=t2.ID应该是t2.ID=t1.ID,对吗?还有一个问题:您能解释一下“选择1”是什么吗意思?是的,确实应该是t2.ID=t1.ID
。我已经纠正了这一点。在EXISTS
子句中,列不会被检索,但您仍然需要在SELECT
之后添加一些内容。对我来说SELECT 1
只是一种风格选择,其他人更喜欢SELECT NULL
或SELECT*
。我选择select1
,因为它比较短,并且表明我不关心值,只关心存在一行
SELECT TO1.KEY,TO1.ID,TO.DATE,TO1.NAME,TO1.TEXT
FROM T_Offer TO1
INNER JOIN
(
select MIN(TO2.KEY) AS KEY from T_Offer TO2 group by ID
)TO3
ON TO1.KEY = TO3.KEY