2017-07-06 6 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に対して1行だけを選択したいと思います。 出力テーブルが生じるはずである:SQL Server 2008.日付のみを使用して1つの行を選択する方法

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ごとに1つのレコードしか返しません。現在、複数の行が同じIDに対して返されます。なぜなら、それぞれの人が異なる日付で予定に来ることができるからです。私は、日付が現在の日付から最も早い日付であるところに各人物の1つのレコードだけが表示されるすべてのデータを選択したいと思います。たとえば、同じ日付の同じ人物の2つのレコード(07/07/17と08/07/17)がある場合は、現在の日付から7/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 

12.07.17を加え:次いで (改訂された質問の)

カウント行番号(お客様ID & CustAtt、appDateによってORDER BY partion)とそれぞれのための最初のものを選択します。

;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

関連する問題