每天为每个人提取第一个条目

时间:2013-11-18 10:08:41

标签: sql sql-server linq linq-to-sql

我有一张桌子,我想为每个人选择每天的第一个“例外” - 例如:

date        agentname   exception   start   stop
01/10/2013  Smith Bob   Open Time   07:00   08:30
01/10/2013  Smith Bob   Open Time   08:45   10:45
07/10/2013  Smith Bob   Open Time   07:00   08:30
07/10/2013  Smith Bob   Open Time   08:45   10:45
08/10/2013  Smith Bob   Open Time   07:00   08:30
08/10/2013  Smith Bob   Open Time   08:45   10:45
04/10/2013  Owen John   On Loan     07:00   14:00
04/10/2013  Owen John   Break       14:00   15:00
07/10/2013  Rix Linda   Open Time   09:00   10:15
07/10/2013  Rix Linda   On Loan     11:00   11:15

sql查询需要拔出:

date        agentname   exception   start   stop
01/10/2013  Smith Bob   Open Time   07:00   08:30
07/10/2013  Smith Bob   Open Time   07:00   08:30
08/10/2013  Smith Bob   Open Time   07:00   08:30
04/10/2013  Owen John   On Loan     07:00   14:00
07/10/2013  Rix Linda   Open Time   09:00   10:15

所以拿鲍勃史密斯 - 他在2013年10月1日有两个参赛作品 - 一个从07:00开始,一个从08:45开始 - 我只想把第一个拿出来(对他来说,和其他人一样,每一天)。

有人可以建议,如何在Sql或Linq中执行此操作?

感谢您的帮助,

标记

2 个答案:

答案 0 :(得分:2)

您也可以使用ROW_NUMBER() OVER

SQLFiddle demo

WITH T1 as 
(
SELECT 
     t.*,
     ROW_NUMBER() OVER 
         (PARTITION BY [DATE],[agentname] ORDER BY [start]) as RowNumber 
     FROM T
)
   SELECT * FROM T1 WHERE RowNumber=1
   Order BY [agentname],[date]

答案 1 :(得分:1)

您只需要在内部查询中进行分组,以获得每天和座席的最短时间。

 select [date], agentname, [exception], [start], [stop]
 from table1 t
 inner join
 (
    select [date], agentname, min([start]) as [start]
    from table1
    group by [date], agentname
 ) X
 on t.[date] = x.[date] and t.agentname = x.agentname and t.[start] = x.[start]

如果每天和座席的开始时间都是唯一的,那么这将有效。