Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从分组依据中仅选择一行?_Sql_Database_Ms Access 2010 - Fatal编程技术网

Sql 从分组依据中仅选择一行?

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

我使用的是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      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