2017-07-06 74 views
0
Select MIN([appdate]), CustID, CustAtt, Surname, Firstname, itemType 
From table 
Where appDate > (getdate()) 
Group by CustID, CustAtt 

CustAtt CustID Surname Firstname appDate  itemType 
53247 20675 A  AX  
49535 12/FX08 B  BX  14/08/2017  solid 
70433 400039 C  CX  
67119 413555 D  DX  
51406 27/EY07 E  EX  14/07/2017  Liquid 
51406 27/EY08 E  EX  13/09/2017  Gas 
51406 27/EY09 E  EX  11/12/2017  Solid A 
51406 27/EY10 E  EX  06/06/2018  Liquid A 
82820 410053 F  FX  
52395 29/FA72 G  GX  25/09/2017  Gas A 
89488 414282 H  HX  
55855 412799 I  IX  30/08/2017  Solid 
55855 412799 I  IX  21/08/2017  Liquid 
53248 16/EK15 J  JX  06/07/2017  Gas 
53248 16/EK15 J  JX  17/07/2017  Solid B 
89835 911528 K  KX  08/05/2018  Solid B 

以上是我从上述脚本输出的代码片段,但没有给我所需的输出。我只想根据appdate列从我的数据集中为每个CustID & CustAtt选择一行。SQL SERVER 2008.如何仅基于日期选择一行

所需的输出应包括从当前日期的下一个最早日期,在的情况下的日期相同的任何给定行是可接受的: 输出表应产生:

CustAtt CustID Surname Firstname appDate  itemType 
53247 20675 A  AX  
49535 12/FX08 B  BX  14/08/2017  solid 
70433 400039 C  CX  
67119 413555 D  DX  
51406 27/EY07 E  EX  14/07/2017  Liquid 
82820 410053 F  FX  
52395 29/FA72 G  GX  25/09/2017  Gas A 
89488 414282 H  HX  
55855 412799 I  IX  21/08/2017  Liquid 
53248 16/EK15 J  JX  06/07/2017  Gas 
89835 911528 K  KX  08/05/2018  Solid B 

回答

0

实施例:http://sqlfiddle.com/#!6/c35e2/1

create table t(
    id int, 
    x int, 
    y int, 
    z int, 
    a int, 
    b int, 
    c datetime 
); 


-- Build t table 
INSERT INTO t values 
(1, 1, 2, 3, 4, 5, getdate()), 
(2, 1, 2, 3, 4, 5, dateadd(hh,+3,getdate())), 
(3, 1, 2, 3, 4, 5, dateadd(hh,+1,getdate())), 
(4, 1, 2, 3, 4, 5, dateadd(hh,+2,getdate())), 
(5, 1, 2, 3, 4, 5, dateadd(hh,-2,getdate())), 
(6, 1, 2, 3, 4, 5, dateadd(hh,-1,getdate())), 
(7, 1, 2, 3, 4, 5, dateadd(hh,+1,getdate())), 
(8, 1, 2, 3, 4, 5, dateadd(hh,+1,getdate())), 
(9, 1, 2, 3, 4, 5, dateadd(hh,+1,getdate())); 

select top 1 t.id, s.*, t.c 
from t 
join (
    select x,y,z,a,b 
    from t 
    group by x,y,z,a,b 
    having count(*) > 1 
) s 
on s.x = t.x 
    and s.y = t.y 
    and s.z = t.z 
    and s.a = t.a 
    and s.b = t.b 
    and (getdate() < t.c) 
order by t.c 
+0

我想每个ID只返回一个记录。目前多个行都返回相同的ID,因为每个人都可以在不同日期进入约会。我想选择所有数据,其中每个人只有一条记录显示,其中日期是从当前日期开始的最早日期。例如,如果我有同一人在不同日期(07/07/17和08/07/17)的2条记录,我希望最早的日期是07/07/17。 – hhpe

+0

我已经更新了答案。 –

0

您必须使用HAVING关键字。它可以过滤“群后”。

SELECT 
MIN([appdate]), 
id, 
type 
FROM 
[table] 
WHERE 
appdate > GETDATE() 
GROUP BY 
id, type 
HAVING 
    COUNT(*) > 1 -- select only records, that have duplicates, based on our "group by" 
ORDER BY 
id 

加入17年7月12日: (对于修订问题)

计数行数(partion由客户ID & CustAtt,为了通过appDate),然后选择第一个为每一个。

;WITH cte AS (
    SELECT 
     *, 
     Row_number() OVER( 
      PARTITION BY CustID, CustAtt ORDER BY appDate 
     ) row_number 
    FROM 
     table 
    ) 
SELECT 
    * 
FROM 
    cte 
WHERE 
    row_number = 1 
+0

您建议的方法仍会返回重复的ID。 – hhpe

+0

因此,您需要*全部*不重复记录和“*最后一个*”为每个重复项(由CustAtt&CustID)? – alex7z

+0

我修改了我的第一个问题,请看看。 – hhpe