Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
访问SQL以按日期仅返回第一次或最后一次出现_Sql_Ms Access - Fatal编程技术网

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

访问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

首先,我对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    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)
    )
)