2016-05-31 3 views
0

私の質問はかなり簡単で説明が簡単だと思います。Microsoft SQL Server:複数の登録日がある場合に単一行/レコードを選択する方法

基本的に私はこれらの線に沿って記録何かを持っています。

ジョン・ドウは、カバレッジの複数の期間を持っています

01-01-2014 --> 12-31-2014 ; 
    01-01-2015 --> 12-31-2015 ; 
    01-01-2016 --> OPEN/ACTIVE (**DESIRED OUTPUT)** 

私が最も最近の登録を引っ張ってMAX関数を使用しようとするたびに、登録期間の各反復を常に引き出します。直前の有効期限をプルするだけでなく、それに対応する終了期限(NULLに設定されているか、入力されているか)を引き出し、それ以前のすべてを除外するだけで、SQLに指示する方法を教えてください。

私はまだTERMEDレコードを取得したいです。それが私の時よりもちょうどMAX有効と期間の両方で;データをミックスしてMAX/EFFをプルしますが、誤ってMAX/TERMを別の登録インスタンスから取得します。

明確化が必要な場合は教えてください。ありがとうございました!

答えて

1

これを行うための一般的な方法は、row_number()使用しています:

select t.* 
from (select t.*, 
      row_number() over (partition by name order by eff_date desc) as seqnum 
     from t 
    ) t 
where seqnum = 1; 
+0

ありがとうございました!私は援助に感謝します! – MellowFellow

0

これは非常に一般的な使用例です。このコードを書くにはいくつかの方法があります。使用されるSQLエンジンによっては、速度が異なります。

かなり一般的な列名を使用します。必要に応じて調整する。

SELECT common_id, msg 
FROM myTable outerTable 
WHERE NOT EXISTS 
    (SELECT * 
    FROM myTable innerTable 
    WHERE innerTable.common_id = outerTable.common_id 
     AND innerTable.time > outerTable.time 
) 

同じcommon_idtime列を持つ2つの行が存在する場合、その両方が出力に表示されますのでご注意ください。 >>=に置き換えて、両方の行を非表示にすることができます。

他の一般的なアプローチは、理解するのが難しいですが、ここにはあります。 NOT EXISTSのアプローチと類似点に注目してください。

SELECT outerTable.common_id, outerTable.msg 
FROM myTable outerTable 
LEFT JOIN myTable innerTable 
    ON innerTable.common_id = outerTable.common_id 
    AND innerTable.time > outerTable.time 
WHERE innerTable.common_id IS NULL 

通常、この2番目の方法は高速です。

0

 
SELECT * FROM coverage ORDER BY start_date DESC LIMIT 1 

編集:上記はpostgresqlのは、MySQLと他の人に理解されています。必要なのは、代わりに

SELECT TOP(1) * FROM coverage ORDER BY start_date DESC 

です(バリーに感謝します)。

または:

SELECT * FROM coverage WHERE start_date = (SELECT MAX(start_date) FROM coverage) 

あなたはおそらく「ジョン・ドウ」のレコードだけを取得するためにいくつかの他のテーブルでこれに参加する必要がある - しかし、あなたはどのようなデータベースのレイアウトを提供しなかったとして、私はこれを残しておきますあなたへ。

+0

私は 'LIMIT 1'がSQL Serverに対して有効ではないと思います。 IIRC、それはOralce構文、あるいは多分MySqlです。 T-SQLはSELECT TOP(1)を使用しています...' – RBarryYoung

+0

ヒントをありがとう。実際、postgresは、私もmysqlがそれをサポートしていることは知っていますが。 – Aconcagua

関連する問題