日期:2014-05-19  浏览次数:20594 次

求有关在重复记录中取日期最晚一组记录记录的SQL脚本
求有关在重复记录中取日期最晚记录的SQL脚本
由于数据非常庞大,需要求效率尽可能高,
Table1字段及数据如下:
BookID,BookName,   P_Date,           P_Time,       P_Address,     P_User
1001       书名1         2007-07-02       10:08:52     北京1路         张三
1001       书名1         2007-07-03       09:20:10     北京2路         张三
1001       书名1         2007-07-02       17:20:50     北京3路         李四
1002       书名2         2007-06-05       14:20:10     北京4路         李四
1002       书名2         2007-04-30       19:50:25     北京5路         李四
....

目标查询结果:
1001       书名1         2007-07-03       09:20:10     北京2路         张三
1002       书名2         2007-06-05       14:20:10     北京4路         李四

我目前的方法是:
select   substring(...)   MaxDate,substring....   from

(select   BookID,BookName,

max(P_Date+P_Time+P_Address+P_User)   as   sTemp

from   Table1   group   by   BookID,BookName)   TempTable

现在的问题:

1、上面用substring取出日期、时间都没问题,因为着两个字段的长度是固定的;但地址和用户就感觉有点棘手,中间不知加什么符号来分割比较好,因为担心用户的地址甚至用户名里有这些符号,这样就可能导致分割出来的数据错位了

2、这种写法总觉得效率上不是很高,有没有更优化速度的写法?

------解决方案--------------------
select * from table as a where not exists
(select 1 from table where BookID = a.BookID and P_Date + P_Time > a.P_Date + a.P_Time)
------解决方案--------------------
select * from table1 a
where not exists (
select 1 from table1
where BookID=a.BookID
and cast(P_Date+ ' '+P_Time as datetime)> cast(a.P_Date+ ' '+a.P_Time as datetime)
)
------解决方案--------------------
try

Select * From Table1 A
Where Not Exists
(Select BookID From Table1 Where BookID = A.BookID And BookName = A.BookName And ((P_Date > A.P_Date) Or (P_Date = A.P_Date And P_Time > A.P_Time)))
------解决方案--------------------
----方法1:
select * from table as a where not exists
(select 1 from table where BookID = a.BookID and P_Date + P_Time > a.P_Date + a.P_Time)

----方法2:
select a.* from table as a
inner join
(select BookID,max(P_Date + P_Time) as dt from table group by BookID) as b
on a.BookID = b.BookID and a.P_Date + a.P_Time = b.dt