访问SQL以按日期仅返回第一次或最后一次出现
首先,我对SQL没有太多的经验,我花了很多时间试图让它工作。请帮忙 我从access数据库中获得了以下列:访问SQL以按日期仅返回第一次或最后一次出现,sql,ms-access,Sql,Ms Access,首先,我对SQL没有太多的经验,我花了很多时间试图让它工作。请帮忙 我从access数据库中获得了以下列:date、time、EP(输入点)、ID,其余列只是信息性的没有主键,表的更改是最后一个解决方案。 DateOS TimeOS EP ID Val1 Val2 Val3 Val4 1.2.2017 1:00:02 in 15 6280 blue line1 s 1.2.2017 3:00:06
date
、time
、EP
(输入点)、ID
,其余列只是信息性的没有主键,表的更改是最后一个解决方案。
DateOS TimeOS EP ID Val1 Val2 Val3 Val4
1.2.2017 1:00:02 in 15 6280 blue line1 s
1.2.2017 3:00:06 in 15 6280 blue line1 s
1.2.2017 4:00:08 in 16 3147 red line2 s
1.2.2017 5:00:10 out 20 6280 white line3 c
1.2.2017 6:00:12 out 20 6280 white line3 c
2.2.2017 2:00:04 in 16 3147 red line2 s
我只需要先获得(绿色)
/上一次发生的事件(红色)具有EP和ID的唯一组合
DateOS TimeOS EP ID Val1 Val2 Val3 Val4
1.2.2017 3:00:06 in 15 6280 blue line1 s
1.2.2017 6:00:12 out 20 6280 white line3 c
2.2.2017 2:00:04 in 16 3147 red line2 s
我的想法来自:
到目前为止,我有这个(第一个是最小函数,最后一个是最大函数):
这是我的。它考虑的只是时间。第二行不属于那个里,因为它是较晚的日期
DateOS TimeOS EP ID Val1 Val2 Val3 Val4
1.2.2017 1:00:02 in 15 6280 blue line1 s
2.2.2017 2:00:04 in 16 3147 red line2 s
1.2.2017 5:00:10 out 20 6280 white line3 c
问题是我需要考虑<代码> DeaOS+TimeOS/COD>。因此,我尝试编写
MIN(DateOS+TimeOS)
,并使用值DateOS+TimeOS
创建新列,但两者都返回空表。我不确定我是否犯了一些错误,或者这是一种错误的方法。处理这种情况的一种方法是检查给定记录之前是否存在任何记录。这使用了不存在
逻辑有点复杂,因为日期/时间在两个不同的列中。但第一个记录是:
SELECT pt.*
FROM [test07_dupl2] AS pt
WHERE NOT EXISTS (SELECT 1
FROM [test07_dupl2] AS pt2
WHERE pt2.EP = pt.EP AND pt2.ID = pt.ID AND
(pt2.DateOS < pt.DateOS OR
pt2.DateOS = pt.DateOS AND pt2.TimeOS < pt.TimeOS
)
);
我在@Gordon Linoff的代码中添加了
DISTICT
函数
以确保具有相同日期和时间的重复行消失
SELECT DISTINCT t.*
FROM[SIMASSIST].[dbo].[TestDupl] AS t
WHERE
NOT EXISTS
(
SELECT 1
FROM[SIMASSIST].[dbo].[TestDupl] AS t2
WHERE t2.EP = t.EP AND t2.ID = t.ID AND
(
(t2.DateOS < t.DateOS OR t2.DateOS = t.DateOS) AND
(t2.TimeOS < t.TimeOS)
)
)
选择DISTINCT t*
来自[SIMASSIST].[dbo].[TestDupl]作为t
哪里
不存在
(
选择1
来自[SIMASSIST].[dbo].[TestDupl]作为t2
式中,t2.EP=t.EP和t2.ID=t.ID和
(
(t2.DateOS
它工作得很好!有趣的是,我花了15分钟写了这篇文章,你一眨眼就回答了。@StanaMacala。其实没那么快;)与其他数据库相比,MS Access的功能相当有限,因此我实际上不得不考虑这一点。
SELECT pt.*
FROM [test07_dupl2] AS pt
WHERE NOT EXISTS (SELECT 1
FROM [test07_dupl2] AS pt2
WHERE pt2.EP = pt.EP AND pt2.ID = pt.ID AND
(pt2.DateOS < pt.DateOS OR
pt2.DateOS = pt.DateOS AND pt2.TimeOS < pt.TimeOS
)
);
(pt2.DateOS > pt.DateOS OR
pt2.DateOS = pt.DateOS AND pt2.TimeOS > pt.TimeOS
)
SELECT DISTINCT t.*
FROM[SIMASSIST].[dbo].[TestDupl] AS t
WHERE
NOT EXISTS
(
SELECT 1
FROM[SIMASSIST].[dbo].[TestDupl] AS t2
WHERE t2.EP = t.EP AND t2.ID = t.ID AND
(
(t2.DateOS < t.DateOS OR t2.DateOS = t.DateOS) AND
(t2.TimeOS < t.TimeOS)
)
)