组SQL中最近的条目

组SQL中最近的条目,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个表,在这个表中,我们可以对多个条目使用相同的票号。我想根据列中的Initiated on检索相同票号的最新票号 Ticket VendorTicket InitiatedOn Comments 198165 test 2012-08-10 16:31:33.707 test 199485 sagar 2012-08-11 12:36:25.720 sagar 199485 sagar1 2012-08

我有一个表,在这个表中,我们可以对多个条目使用相同的票号。我想根据列中的Initiated on检索相同票号的最新票号

Ticket  VendorTicket  InitiatedOn              Comments
198165  test          2012-08-10 16:31:33.707  test
199485  sagar         2012-08-11 12:36:25.720  sagar
199485  sagar1        2012-08-11 14:36:25.720  sagar1
199478  kishor        2012-08-11 12:37:21.923  kishor
我已经在存储过程中用T-SQL编写了这个查询,它告诉我xObj={靠近“.”的语法不正确。}

我的T-SQL

`@SQL='Select ''<a href="javascript:editTicketByIDAction('' + CONVERT(VarChar(Max), Ticket) + '')">'' + CONVERT(VarChar(Max),Ticket) + ''</a>'' t1.Ticket,t1.VendorTicket[Vendor Ticket],t1.Comments 
From VendorTickets t1 
WHERE NotifyOn <= GetDate() And NotifyOn Is Not Null AND 
NOT EXISTS
(SELECT * FROM VendorTickets t2 
WHERE t1.Ticket = t2.Ticket AND t1.InitiatedOn < t2.InitiatedOn)'`
试试这个:

这将给出每组的最新记录

select * from  <table> t join
(select Ticket,max(InitiatedOn) as InitiatedOn
from <table>
group by Ticket)a
on t.Ticket=a.Ticket
and t.InitiatedOn=a.InitiatedOn
如果您可以使用上面的行号

select T.Ticket,
       T.VendorTicket,
       T.InitiatedOn,
       T.Comments
from (
     select Ticket,
            VendorTicket,
            InitiatedOn,
            Comments,
            row_number() over(partition by Ticket order by InitiatedOn desc) as rn
     from YourTable
     ) T
where T.rn = 1

解决此问题的一般解决方案适用于任何数据库,如下所示:

SELECT * FROM [my_table] t1
WHERE NOT EXISTS (
  SELECT * FROM [my_table] t2
  WHERE t1.Ticket = t2.Ticket
  AND t1.InitiatedOn < t2.InitiatedOn
)
这是这样的:从my_表中获取所有值,其中没有具有相同票证ID和较新日期的票证

注:

如果有两个具有相同InitiateOn值的最新票证,则可能返回重复的票证。 确保在Ticket和initialedon列上都有适当的索引
您使用的是什么数据库?这里有返回重复项的轻微风险。这可能与OP有关,当然这是完美的!我一直在寻找一种方法来做到这一点已经有一段时间了+1.为什么当我对t1中的一个字段执行联接时,没有返回结果?例如,如果t1有一个电话号码字段,而我有一个电话簿表和一个号码字段,那么如何将号码与姓名匹配?@enchance:如果将此作为常规堆栈溢出问题来提问,您可能会得到更好的答案。
SELECT * FROM [my_table] t1
WHERE NOT EXISTS (
  SELECT * FROM [my_table] t2
  WHERE t1.Ticket = t2.Ticket
  AND t1.InitiatedOn < t2.InitiatedOn
)
Select t1.* 
from tickets t1 
left join tickets t2 on (t1.ticket = t2.ticket and t2.initiatedon > t1.initiatedon)
where t2.ticket is null;
SELECT   Ticket,
         VendorTicket,
         InitiatedOn,
         Comments
FROM     (
         SELECT   Ticket,
                  VendorTicket,
                  InitiatedOn,
                  Comments, 
                  ROW_NUMBER() OVER (PARTITION BY Ticket ORDER BY InitiatedOn DESC) AS Row
         FROM     Table
         ) AS Q
WHERE    Q.Row = 1