如何根据时间选择第一条记录

时间:2013-03-25 16:57:11

标签: sql-server ranking ranking-functions

我有两个表,一个呼叫表和一个呼叫后工作表。即使后呼叫工作记录存储在呼叫表中,这两个表也具有一对一的关系。您可以通过在呼叫表中连接三个值来将呼叫链接到呼叫后工作呼叫。调用表还包含调用的开始和结束时间的值。

后呼叫工作表中的数据总是很乱,有一次呼叫有多个呼叫后工作记录。我的客户希望我根据通话的开始时间挑出第一条记录,只取这一行数据。

有人建议使用RANKING功能但我不熟悉这个任何机构有什么想法吗?

如果需要进一步解释,请告诉我。

谢谢

1 个答案:

答案 0 :(得分:0)

自我提取排名和密集排名示例假设您正在使用SQL Server 2008或更高版本。

declare @Person Table ( personID int identity, person varchar(8));

insert into @Person values ('Brett'),('Sean'),('Chad'),('Michael'),('Ray'),('Erik'),('Queyn');

declare @Orders table ( OrderID int identity, PersonID int, Desciption varchar(32), Amount int);

insert into @Orders values (1, 'Shirt', 20),(1, 'Shoes', 50),(2, 'Shirt', 22),(2, 'Shoes', 20),(3, 'Shirt', 20),(3, 'Shoes', 50),(3, 'Hat', 20),(4, 'Shirt', 20),(5, 'Shirt', 20),(5, 'Pants', 30),
(6, 'Shirt', 20),(6, 'RunningShoes', 70),(7, 'Shirt', 22),(7, 'Shoes', 40),(7, 'Coat', 80);

with a as 
    (
    Select
        person
    ,   o.Desciption
    ,   o.Amount
    ,   rank() over(partition by p.personId order by Amount) as Ranking
    ,   Dense_rank() over(partition by p.personId order by Amount) as DenseRanking
    from @Person p
        join @Orders o on p.personID = o.PersonID
    )
select *
from a 
where Ranking <= 2  -- determine top 2, 3, etc.... whatever you want.
order by person, amount