sql - 访问 SQL 以仅按日期返回第一次或最后一次出现
问题描述
首先,我没有太多使用 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
我只需要先获得(预期结果为绿色)
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
/ last(预期结果中的红色)具有 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
)
这就是结果。它只考虑 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
但都返回空表。我不确定我是否犯了一些错误,或者这是错误的方法。
解决方案
处理此问题的一种方法是检查在给定记录之前是否存在任何记录。这使用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
)
推荐阅读
- python - 使用python对列表进行排序
- php - 表单数据未插入数据库
- python - 我有需要转换为时间序列数据的数据集,但是当我传递日期时,它给了我 ValueError 的错误:年份超出范围?
- java - JAVA 在 YAML 文件中删除和写入键和值
- python - Opencv cv::Scalar 未定义
- python - 查找重复文件夹并通过在 python 中为父文件夹名称添加前缀来重命名它们
- python-3.x - 获取垂直线的线坐标 numpy
- html - 如何更改 HTML Angular 中显示的文本?
- niftynet - Niftynet 如何处理多 GPU 训练
- mysql - SQL 从表中获取行,除非值存在