在oracle中选择datetime列时重复记录

时间:2013-01-29 14:10:48

标签: sql oracle

我有两个表,我想进行此查询:

SELECT table1.name, table2.date 
FROM table1 
JOIN table2 ON table1.id=table2.id 
AND table2.date >= to_date('01/28/2013', 'mm/dd/yy HH24:mi:ss')

问题是table2.date是一个datetime字段,你可以在同一天有两个或多个同一table2.id的记录(比方说,01/28),我只想得到每个id的一条记录< / p>

我尝试使用trunc方法解决我的问题:

SELECT table1.name, TRUNC(table2.date)
FROM table1 
JOIN table2 ON table1.id=table2.id 
AND TRUNC(table2.date) >= to_date('01/28/2013', 'mm/dd/yy')

部分工作,重复的记录不再显示,但我的问题是我需要时间段的日期时间字段

如何在不使用TRUNC的情况下避免重复记录?

2 个答案:

答案 0 :(得分:1)

执行此操作的规范方法是使用row_number()和子查询选择一行:

SELECT table1.name, t2.date 
FROM table1 JOIN
     (select t.*, ROW_NUMBER() over (partition by id order by date) as seqnum
      from table2 t
     ) t2
     ON table1.id=table2.id and seqnum = 1
WHERE table2.date >= to_date('01/28/2013', 'mm/dd/yy HH24:mi:ss')

但是,你可以通过聚合做你想做的事情:

SELECT table1.name, min(table2.date)
FROM table1 
JOIN table2 ON table1.id=table2.id 
AND table2.date >= to_date('01/28/2013', 'mm/dd/yy HH24:mi:ss')
group by table1.name, trunc(table2.date)

答案 1 :(得分:0)

为什么不从select:

中删除trunc函数
SELECT table1.name, table2.date
FROM table1 
JOIN table2 ON table1.id=table2.id 
AND TRUNC(table2.date) >= to_date('01/28/2013', 'mm/dd/yyyy')