从一组中只选择一行?

时间:2015-09-03 16:28:44

标签: sql database ms-access-2010

我正在使用Microsoft Access 2010,我有一个表T_Offers,如下所示:

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的2个商品具有相同的日期,则结果表会重复ID,并且我不希望这种情况发生。有没有替代这个问题?

4 个答案:

答案 0 :(得分:2)

您可以使用NOT EXISTS排除存在具有相同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
        );

这将为每个ID留下1行,并且它将是具有最早日期的行。

关于然后删除第一个日期相同的重复项,我不确定你的逻辑,但你可能需要构建进一步的检查,这可能会变得非常混乱。在这种情况下,我使用Key来确定应该返回两个记录中的哪一个。

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 = t2.ID
            AND (   t2.Date < t1.Date
                OR  (t2.Date = t1.Date AND t2.Key < t1.Key)
                )
        );

答案 1 :(得分:0)

假设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
              );

答案 2 :(得分:0)

您需要选择不同的查询:

SELECT DISTINCT ID, name, text, MIN (date) AS minDate
FROM T_Offers
GROUP BY ID, name, text
ORDER BY ID asc;

答案 3 :(得分:0)

这是我的解决方案。我的测试环境是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

建议:我帮助您提供创建表格的脚本并插入测试数据(如果它对您来说很容易)。