我有两个表,我想进行此查询:
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的情况下避免重复记录?
答案 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')