2016-03-22 4 views
1

私のクエリは、18か月間入院していないすべての患者のデータを探して抽出することになっています。18か月以内に新しい記録を持たない患者を返す

oID Date   Crea 
1  2014-09-22 153 
1  2012-10-15 365 
2  2014-08-02 212 
2  2015-02-18 245 
3  2016-03-19 438 

彼らは2014-09-22ので、エントリがないので、私はoID 1のための最新のエントリを抽出 - しかし、私は、彼らは以来、1を持っていた場合oID 2は18ヶ月前のエントリを持っていたにも関わらず、他のすべてのデータを省略する必要があります。どうすればこれを達成できますか?これは動作していないよう

oID Date   Crea 
1  2014-09-22 153 
1  2012-10-15 365 
2  2014-08-02 212 
2  2015-02-18 245 
3  2016-03-19 438 
4     514 

select ifnull(date_column , 'No visit') 

答えて

1
あなたは二重のアンチパターンを試すことができ

SELECT e1.*     /* Select entry.. */ 
     FROM entry e1 

LEFT JOIN entry e2   /* Find later entries for same oid */ 
     ON e2.oid = e1.oid 
     AND e2.date > e1.date 

LEFT JOIN entry e3   /* Find entries for same oid within 18 months */ 
     ON e3.oid = e1.oid 
     AND e3.date > CURDATE() - INTERVAL 18 MONTH 

    WHERE e2.oid IS NULL  /* e2 doesn't exist */ 
     AND e3.oid IS NULL  /* e3 doesn't exist */ 

SQL Fiddle

+0

完璧に動作します!どうもありがとう! –

1

使用TIMESTAMPDIFF() 2つの日付の差を見つけるための

さらに私はなしエントリを持つ任意の患者を返却する必要があります。 クエリの下に試してみてください

SELECT oID 
FROM table_name 
WHERE 18 < (SELECT TIMESTAMPDIFF(MONTH, date, date) 
      FROM table_name a, table_name b 
      WHERE a.oID = b.oID); 
+0

感謝を参照してください - これは、DateDiff関数を見つけるのに便利ですが、私は何の患者を返さないと思いました過去18ヶ月間の日付入力。とにかく乾杯! –

関連する問題