我正在使用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,并且我不希望这种情况发生。有没有替代这个问题?
答案 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
建议:我帮助您提供创建表格的脚本并插入测试数据(如果它对您来说很容易)。