2016-02-13 56 views
0

最後一個值我想要當我使用max(date)它包括2016年價值創造的2015需要從上年

患者的最後血壓值的查詢,但是當我申請where date < '2016-01-01'它不給我2015年這些患者的價值,而只是將其從結果中刪除。

到目前爲止查詢:

select distinct 
    pat.pat_last_name, 
    pat.pat_first_name, 
    pat.birth_date, 
    enc.bmi, 
    enc.contact_date, 
    enc.[weight], 
    enc.height, 
    pat.PAT_ID 
from 
    pat_enc enc 
    inner join patient pat on enc.pat_id = pat.pat_id 
    inner join (
     select pat_id, max(contact_date) as LastEncounter 
     from pat_enc 
     group by pat_id 
     ) enc2 on enc.pat_id = enc2.pat_id and enc.contact_date = enc2.lastencounter 
where 
    enc.contact_date < '2016-01-01' and 
    enc.bmi is not null 
group by 
    pat.pat_last_name, 
    pat.PAT_FIRST_NAME, 
    pat.birth_date, 
    enc.bmi, 
    enc.contact_date, 
    enc‌​.[weight], 
    enc.height, 
    pat.PAT_ID 
+5

請用您正在使用的數據庫標記您的問題。此外,樣本數據和期望的結果也很有幫助。 –

+3

發佈您的查詢 –

+1

請閱讀[**如何提問**](http://stackoverflow.com/help/how-to-ask) \t \t這裏是一個偉大的地方[**開始**](http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/) –

回答

0

試試這個:

SELECT * FROM dbo.bloodpressures WHERE YEAR(Date) = 2015 
+0

而在此之前,你應該格式化日期字符串成日期數據類型)(在MySQL中)。年份功能將從該日期提取年份。 –

0

,並制定gabrielVas回答遠一點,因爲你specificely問的最後一個值

SELECT * FROM dbo.bloodpressures WHERE YEAR(Date) = 2015 
order by date desc 
limit 1 
+0

限制功能似乎不起作用 – agalgay

+0

@agalgay:您正在使用哪些DBMS? Postgres的?甲骨文? DB2? –

+0

SQL Server 2012 – agalgay

0

你所遇到的問題是你僅僅因爲這個而獲取絕對最大日期:

select pat_id, max(contact_date) as LastEncounter 
.... 
enc2.pat_id and enc.contact_date = enc2.lastencounter 

where子句唯一限制數據之後此相匹配。

,使之成爲2015年獲取數據,你也需要從2015年獲得最大日期:

inner join (
    select pat_id, max(contact_date) as LastEncounter 
    from pat_enc 
    where contact_date < '2016-01-01' 
    group by pat_id 
    ) enc2 on enc.pat_id = enc2.pat_id and enc.contact_date = 
+0

謝謝。這似乎糾正了很多,但有一個病人我一直用作成功的參考,他仍然錯過了這個查詢,即使他在2015年8月訪問過。 – agalgay

+0

不得不在其中添加一個「不爲空」的地方上面的聲明,以確保它拉動實際的辦公室訪問。所有解決...謝謝 – agalgay

0

取而代之的是MAX子查詢,你可以簡單地套用一個ROW_NUMBER

select 
    pat.pat_last_name, 
    pat.pat_first_name, 
    pat.birth_date, 
    enc.bmi, 
    enc.contact_date, 
    enc.[weight], 
    enc.height, 
    pat.PAT_ID 
from 
    patient as pat 
    inner join 
     (
     select *, 
      row_number() 
      over (partition by pat_id 
        order by contact_date desc) as rn 
     from pat_enc 
     where contact_date < '2016-01-01' 
      and bmi is not null -- depending on your need might be moved to the outer WHERE 
    ) as enc 
    on enc.pat_id = pat.pat_id 
where rn = 1 

順便說一句,GROUP BYDISTINCT完全相同,如果patient.pat_id是唯一的,則不需要它。