首先,我在SQL方面没有太多经验,并且花了很多时间尝试使其工作。请帮忙。
我从访问数据库中获得original table,该数据库包含以下列: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
我只需要第一(expected result中的绿色)
DateOS TimeOS EP ID Val1 Val2 Val3 Val4
1.2.2017 1:00:02 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
/ 最后(在expected result中为红色)具有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
我有以下想法: Get the first instance of a row using MS Access
到目前为止,我有这个功能(最小功能代表第一个功能,最大功能代表最后一个功能):
SELECT
FORMAT(pt.DateOS, 'dd.MM.yyyy') AS DateOS,
FORMAT(pt.TimeOS, 'HH:mm:ss') AS TimeOS,
pt.EP, pt.ID, pt.Val1, pt.Val2, pt.Val3, pt.val4
FROM [test07_dupl2] AS pt
WHERE TimeOS
IN
(
SELECT
MIN(TimeOS) AS MinDateTimeOS
FROM [test07_dupl2]
GROUP BY EP+ID
)
这是result。它仅考虑TimeOS。第二行不属于该行,因为它是较晚的日期。
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
问题是我需要考虑DateOS + TimeOS
。因此,我尝试编写MIN(DateOS + TimeOS)
并创建一个值为DateOS + TimeOS
的新列,但都返回了空表。我不确定是否犯了一些错误,或者这是错误的方法。
答案 0 :(得分:1)
处理此问题的一种方法是检查给定记录之前 不存在任何记录。这使用NOT EXISTS
。
由于日期/时间位于两个不同的列中,因此逻辑有点复杂。但对于第一个记录:
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
)
答案 1 :(得分:0)
我已将DISTICT
函数添加到@Gordon Linoff的代码中
以确保同样日期和时间的重复行也消失了。
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)
)
)