让我们说这是我的一个问题的结果:
+------+--------------------------+
| ID | STARTED_TIME |
+------+--------------------------+
| 9870 | 17-07-05 16:15:30,040000 |
+------+--------------------------+
| 9871 | 17-07-06 16:15:25,586000 |
+------+--------------------------+
| 9872 | 17-07-07 15:08:08,370000 |
+------+--------------------------+
| 9873 | 17-07-07 16:15:20,208000 |
+------+--------------------------+
| 9874 | 17-07-08 16:15:22,166000 |
+------+--------------------------+
| 9875 | 17-07-09 16:15:29,812000 |
+------+--------------------------+
我想要做的是在STARTED_TIME是相同的DAY时删除重复项并获取当天的最后一项。例:
+------+--------------------------+
| ID | STARTED_TIME |
+------+--------------------------+
| 9870 | 17-07-05 16:15:30,040000 |
+------+--------------------------+
| 9871 | 17-07-06 16:15:25,586000 |
+------+--------------------------+
| 9873 | 17-07-07 16:15:20,208000 |
+------+--------------------------+
| 9874 | 17-07-08 16:15:22,166000 |
+------+--------------------------+
| 9875 | 17-07-09 16:15:29,812000 |
+------+--------------------------+
请注意,这是在Oracle数据库中。我在这里问得太多了?任何帮助表示赞赏。谢谢!
答案 0 :(得分:5)
在Oracle中,TRUNC函数删除日期的时间部分。我们还需要一个窗口函数来提供一个计数器,它会在每天变化时重置:
SELECT
z.id,
z.started_time
FROM
(
SELECT
t.*,
TRUNC(started_time) as started_day, --you can remove this column if you want
ROW_NUMBER() OVER(PARTITION BY TRUNC(started_time) ORDER BY started_time DESC) as rown
FROM mytable t
) z
WHERE z.rown=1
ORDER BY id
TRUNC删除时间部分,只留下日期,ROW_NUMBER为所有行添加一个递增的数字,其中日期相同(分区依据),行按降序排序,因此最新得到的rownumber = 1 < / p>
然后外部查询的WHERE子句只选择行号为1的行,即最新时间
我选择最新,因为你的例子也是。如果您想要最早,您的查询必须说partiton by trunc(started_time) order by started_time asc
而不是desc
如果您想了解有关查询如何工作的更多信息,只需运行内部查询并查看数据。我放在那里的列对你的外部查询没有任何意义,但如果你只是运行内部查询,它有助于解释它是如何工作的