访问SQL以按日期仅返回第一次或最后一次出现

时间:2018-09-25 10:51:15

标签: sql ms-access

首先,我在SQL方面没有太多经验,并且花了很多时间尝试使其工作。请帮忙。

我从访问数据库中获得original table,该数据库包含以下列:datetimeEP(入口点),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的新列,但都返回了空表。我不确定是否犯了一些错误,或者这是错误的方法。

2 个答案:

答案 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)
    )
)