2017-04-26 5 views
0

abcで第一及び第二の挿入値をしたい:私は条件

Consgno  Name  Entrydatetime 

111   A  01/03/2017 10:10:15 
111   A  01/03/2017 10:20:15 
111   A  01/03/2017 11:10:20 
222   B  02/03/2017 10:10:25 
333   C  06/03/2017 10:10:25 
333   C  07/03/2017 10:10:12 
444   D  04/03/2017 10:10:41 
444   D  04/03/2017 01:10:20 
444   D  06/03/2017 10:10:32 
555   E  05/04/2017 10:10:15 

Consgnoは1時間より1つ多く入っている一つ。

1つのConsgnoが1回だけの場合、最初の値が来るはずです。そうでない場合、2番目に入力された値が来るはずです。

私はこのような出力したい:

Consgno Name  Entrydatetime 
    111  A  01/03/2017 10:20:15 
    222  B  02/03/2017 11:10:36 
    333  C  07/03/2017 10:10:12 
    444  D  04/03/2017 01:10:20 
    555  E  05/04/2017 10:10:15 
+0

を? –

+0

私はMssql 2012を使用しています –

+1

あなたのサンプルの結果は間違っていると思いますか、私はあなたの質問を大きく誤解しました。あなたのサンプル入力に '222 B 02/03/2017 11:10:3​​6'の行はありません –

答えて

1

あなたは次のようなクエリを使用することができます。

;WITH MyWindowedTable AS (
    SELECT Consgno, Name, Entrydatetime, 
      ROW_NUMBER() OVER (PARTITION BY Consgno 
          ORDER BY Entrydatetime) AS rn, 
      COUNT(*) OVER (PARTITION BY Consgno) AS cnt 
FROM mytable 
) 
SELECT Consgno, Name, Entrydatetime 
FROM MyWindowedTable 
WHERE (cnt = 1 AND rn = 1) OR (cnt > 1 AND rn = 2) 

COUNTのウィンドウバージョンの使用:

COUNT(*) OVER (PARTITION BY Consgno) 

は人口を返します。 、cnt、各Consgnoパーティション。 cntを使って、返されたレコードを適切にフィルタリングすることができます。母集団が1のパーティションでは、パーティションの単一レコードを取得しますが、その他の場合はrn = 2のレコードを取得します。

1

使用ROW_NUMBERと機能に建てCOUNT:RDBMSは、使用している

CREATE TABLE #table1 (Consgno INT, Name VARCHAR(1), Entrydatetime 
         DATETIME) 

INSERT INTO #table1 (Consgno , Name , Entrydatetime) 
SELECT 111,'A','01/03/2017 10:10:15' UNION ALL 
SELECT 111,'A','01/03/2017 10:20:15' UNION ALL 
SELECT 111,'A','01/03/2017 11:10:20' UNION ALL 
SELECT 222,'B','02/03/2017 10:10:25' UNION ALL 
SELECT 333,'C','06/03/2017 10:10:25' UNION ALL 
SELECT 333,'C','07/03/2017 10:10:12' UNION ALL 
SELECT 444,'D','04/03/2017 10:10:41' UNION ALL 
SELECT 444,'D','04/03/2017 01:10:20' UNION ALL 
SELECT 444,'D','06/03/2017 10:10:32' UNION ALL 
SELECT 555,'E','05/04/2017 10:10:15' 

SELECT Consgno , Name , Entrydatetime 
FROM 
(
    SELECT Consgno , Name , Entrydatetime , ROW_NUMBER() OVER (PARTITION BY 
      Consgno ORDER BY Entrydatetime) RNo , COUNT(*) OVER (PARTITION BY 
      Consgno) AS _Count 
    FROM #table1 
) A WHERE (RNo = 1 AND _Count = 1) OR (_Count > 1 AND RNo = 2)