2015-12-18 27 views
5

Bu ziyaret sırasında ağırlıkları gibi, ofisimize çeşitli ziyaretlerinin ayrıntılarını gösteren hastalar için bir veritabanımız var. Bu ziyaretin tarihi ile hastanın ilk ziyaretinin mümkün olan en büyük değer olduğu ancak günlerin X sayısını geçmediği arasındaki farka dayanarak ziyareti (tablodan bir satır) döndüren bir rapor oluşturmak istiyorum.MySQL - Sütun + X> sütunu ile satır seçin Satır

Bu kafa karıştırıcı, bu yüzden bir örnek çalışmama izin verin. o 28 gün içine, çünkü ben "30 gün" için bu raporu çalıştırmak isteyen olsaydı, ben satır nerede visit_id = 5 dönmek ister ki, benim sorguda

visit_id | created    | patient_id | weight 
---------+---------------------+------------+------- 
     1 | 2006-08-08 09:00:05 |   10 | 180 
     2 | 2006-08-15 09:01:03 |   10 | 178 
     3 | 2006-08-22 09:05:43 |   10 | 177 
     4 | 2006-08-29 08:54:38 |   10 | 176 
     5 | 2006-09-05 08:57:41 |   10 | 174 
     6 | 2006-09-12 09:02:15 |   10 | 173 

: ı Aşağıdaki tabloda patient_visits denilen var diyelim gelecek ve gelecek sıra 35 gün olacak, bu da çok fazla.

Böyle tabloyu kendisiyle katılmadan ya da eşit veya created + 30 days daha azdır created maksimum değer döndürmek için denemek için WHERE deyimindeki bir alt sorguyu oluşturma gibi şeyler, çeşitli çalıştı ama ettik Bu noktada bir kayıp gibi görünüyor. Son çare olarak, tüm verileri bir PHP dizisine çekebilir ve orada bir mantık oluşturabilirim, ama gerçekten istemiyorum.

Büyük resmi şudur: Veritabanında her biri herhangi bir sayıda ofis ziyareti olan yaklaşık 5.000 hasta vardır. İlk ziyaretten X gününe çıkarken (yani, her bir hastanın ilk ziyaretinden X gün, keyfi bir X-gün periyodu değil) birleştirilmiş tüm hastalar için ortalama bekleme kaybının ne olduğunu anlatmak için raporu oluşturmak istiyorum.). Umarım yukarıdaki çözüme kavuşursam geri kalanını halledebilirim.

+0

Bunu tekrar söyleyeyim: her hasta_kullanıcı için * en erken * ziyareti yapmalıyız (hadi buna * çapa * diyelim), daha sonra başka bir ziyaret bulunuz * en uzak * çapadan ancak en fazla X gün olmaktan . Diğer tüm ziyaretler (yani, çapa ve X günlerinin üstündekilere daha yakın olanlar) atılmalıdır. Sağ? –

cevap

0

Sen (bu karşılaştırma tarih için doğru sözdizimi vardır unutmayın ve sorgunun sadece bir şema olan) böyle bir sorgu kullanarak birinci ve sonraki ziyaret tarihini alabilirsiniz:

select 
    first_visits.patient_id, 
    first_visits.date first_date, 
    max(next_visit.created) next_date 
from (
    select patient_id, min(created) as "date" 
    from patient_visits 
    group by patient_id 
) as first_visits 
inner join patient_visits next_visit 
    on (next_visit.patient_id = first_visits.patient_id 
     and next_visit.created between first_visits.created and first_visits.created + 30 days) 
group by first_visits.patient_id, first_visits.date 

Temel olarak, patient_id ile gruplandırmayı kullanarak başlangıç ​​tarihini bulmanız ve ardından patient_visits'a katılmanız ve 30 gün içinde olan maksimum tarihi bulmanız gerekir.

Ardından, başlangıç ​​ve bitiş ağırlıklarını almak ve kaybı hesaplamak için sonucu patient_visits'a katabilirsiniz.

+0

Bu doğru yönde gidiyor gibi görünüyor. Ben, çalıştırılabilir bir sorgu yapmak için yukarıdaki birkaç şeyi değiştirebildim ve uygun tarihlere geri döndü ve 1.02 saniyede. Yine de birleşme ile iki problem yaşıyorum. İlk hızdır .. yürütmek için 64 saniye sürer. İkincisi, bir sonraki ziyarete nasıl katılacağımı anlayamıyorum .. 'ON max (next_visit.created)' veya 'ON next_date' tablosuna katılamıyorum. –