2017-10-16 35 views
0

如何提取具有最低时间值的多行中的第一条记录。如何获取MSSQL中每个重复行只有一条记录

是这样的:

PersNr | Name | Day | From | To | TaskNr 
------------------------------------------------ 
1000  Peter 2017-10-16 25050 -2  110 
1001  Emily 2017-10-16 25038 -2  110 
1010  Greg 2017-10-16 28306 31371  120 
1010  Greg 2017-10-16 31371 -2  150 
1012  Jon 2017-10-16 24805 26716  170 
1012  Jon 2017-10-16 26716 29227  110 
1012  Jon 2017-10-16 29227 -2  150 

我需要唯一的名称和他们什么时候开始工作(从最低值)上的任务。

应该是这样的:

PersNr | Name | Day | From | To | TaskNr 
------------------------------------------------ 
1000  Peter 2017-10-16 25050 -2  110 
1001  Emily 2017-10-16 25038 -2  110 
1010  Greg 2017-10-16 28306 31371  120 
1012  Jon 2017-10-16 24805 26716  170 

我创建的表是这样的:

SELECT AB.PersNr 
       ,P.Name AS name 
       ,CONVERT(char(10),DATEADD(DAY, AB.Tag, '30.12.1899'),126) AS Day 
       ,AB.From 
       ,AB.To 
       ,AB.TaskNr 
       FROM AStpFromTo AB 
       LEFT JOIN Tasks A ON (A.TaskNr = AB.TaskNr) 
       INNER JOIN Person P ON (P.PersNr = AB.PersNr) 
       WHERE P.Department = 170 AND AB.Day = DATEDIFF(DAY, '30.12.1899', GETDATE()) 

回答

0

你只需按任务需要一个排序函数命令,以获得最低的国家之一:

WITH CTE 
AS 
(
    SELECT AB.PersNr 
    ,P.Name AS name 
    ,CONVERT(char(10),DATEADD(DAY, AB.Tag, '30.12.1899'),126) AS Day 
    ,AB.From 
    ,AB.To 
    ,AB.TaskNr 
    , ROW_NUMBER() OVER(PARTITION BY PerNr ORDER BY [From]) AS RN 
    FROM AStpFromTo AB 
    LEFT JOIN Tasks A ON (A.TaskNr = AB.TaskNr) 
    INNER JOIN Person P ON (P.PersNr = AB.PersNr) 
    WHERE P.Department = 170 AND AB.Day = DATEDIFF(DAY, '30.12.1899', GETDATE()) 
) 
SELECT * 
FROM CTE 
WHERE RN = 1; 

结果:

| PersNr | Name |     Day | From | To | TaskNr | RN | 
|--------|-------|----------------------|-------|-------|--------|----| 
| 1000 | Peter | 2017-10-16T00:00:00Z | 25050 | -2 | 110 | 1 | 
| 1001 | Emily | 2017-10-16T00:00:00Z | 25038 | -2 | 110 | 1 | 
| 1010 | Greg | 2017-10-16T00:00:00Z | 28306 | 31371 | 120 | 1 | 
| 1012 | Jon | 2017-10-16T00:00:00Z | 24805 | 26716 | 170 | 1 | 
+1

结果乔恩是不正确的,按照什么OP希望。 –

+0

@PrabhatG - 谢谢,现在修复 – 2017-10-16 10:41:46

0

尝试使用此查询。

;with cte AS (
select *,ROW_NUMBER()over(partition by PersNr order by (select 1))rnum from tab 
) 
select * from cte where rnum=1 
0

尝试这个appr oach:

create table #tbl(PersNr int,Name varchar(100), Day date,"From" int,"To" int,TaskNr int) 

insert into #tbl values 
(1000  ,'Peter' ,'2017-10-16' ,25050 ,-2  ,110), 
(1001  ,'Emily' ,'2017-10-16' ,25038 ,-2  ,110), 
(1010  ,'Greg' ,'2017-10-16' ,28306 ,31371  ,120), 
(1010  ,'Greg' ,'2017-10-16' ,31371 ,-2  ,150), 
(1012  ,'Jon' ,'2017-10-16' ,24805 ,26716  ,170), 
(1012  ,'Jon' ,'2017-10-16' ,26716 ,29227  ,110), 
(1012  ,'Jon' ,'2017-10-16' ,29227 , -2  ,150) 

SQL查询:

Select iq.* from 
(
select a.*, ROW_NUMBER() OVER(PARTITION BY PersNr ORDER BY "From") AS RowNumber 
from #tbl a 
)iq 
where iq.RowNumber = 1 

输出:

PersNr  Name  Day  From  To   TaskNr  RowNumber 
----------- -------- ---------- ----------- ----------- ----------- ----------- 
1000  Peter 2017-10-16 25050  -2   110   1 
1001  Emily 2017-10-16 25038  -2   110   1 
1010  Greg  2017-10-16 28306  31371  120   1 
1012  Jon  2017-10-16 24805  26716  170   1 
相关问题