我在数据库中有一个表 (DATA_RECORDS),其中包含同一日期的多条记录,但时间不同,运行时间为 2015-2018 年。我想要做的是选择给定日期范围内的所有记录,然后选择每个日期可用的最新记录。我在 SQL 中的当前代码是:
SELECT NAME, DATE_LOADED, R_ID
FROM DATA_RECORDS
WHERE ((DATE_LOADED>=to_date('01/12/2018 00:00:00', 'dd/mm/yyyy HH24:MI:SS'))
AND (DATE_LOADED<=to_date('31/12/2018 23:59:59', 'dd/mm/yyyy HH24:MI:SS')))
ORDER BY DATE_LOADED DESC;
其中列名是“NAME”、“DATE_LOADED”和“R_ID”。以上给出了以下结果:
NAME |DATE_LOADED |R_ID
-------------------------------------
RECORD_1 |31/12/2018 17:36:38 |1234
RECORD_2 |31/12/2018 10:15:11 |1235
RECORD_3 |30/12/2018 16:45:23 |1236
RECORD_4 |30/12/2018 09:06:54 |1237
RECORD_5 |30/12/2018 07:53:30 |1238
等等...如您所见,每天的上传数量也不一致。
我想要的是选择
NAME |DATE_LOADED |R_ID
-------------------------------------
RECORD_1 |31/12/2018 17:36:38 |1234
RECORD_3 |30/12/2018 16:45:23 |1236
我对 SQL 很陌生,所以任何帮助将不胜感激。
注意:我正在使用 Oracle SQL Developer 并且我只有对数据库的只读访问权限,因此我无法创建任何新表或修改当前表。
我会把这个逻辑写成:
SELECT NAME, DATE_LOADED, R_ID
FROM DATA_RECORDS
WHERE DATE_LOADED >= DATE '2018-01-12' AND
DATE_LODED < DATE '2018-12-31'
ORDER BY DATE_LOADED DESC;
然后一个简单的方法是ROW_NUMBER()
- 以及仅从日期/时间值中提取日期:
SELECT NAME, DATE_LOADED, R_ID
FROM (SELECT NAME, DATE_LOADED, R_ID ,
ROW_NUMBER() OVER (PARTITION BY TRUNC(DATE_LOADED) ORDER BY DATE_LOADED DESC) as seqnum
FROM DATA_RECORDS
WHERE DATE_LOADED >= DATE '2018-01-12' AND
DATE_LODED < DATE '2018-12-31'
) dr
WHERE seqnum = 1
ORDER BY DATE_LOADED DESC;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句