2017-07-06 111 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