2010-02-28 139 views
4

所以我得到了這個說法,工作正常:集團通過SQL語句

SELECT MAX(patient_history_date_bio) AS med_date, medication_name 
FROM  biological 
WHERE patient_id = 12) 
GROUP BY medication_name 

不過,我想有相應的medication_dose也。所以我鍵入這件事

SELECT MAX(patient_history_date_bio) AS med_date, medication_name, medication_dose 
FROM  biological 
WHERE (patient_id = 12) 
GROUP BY medication_name 

但是,它給了我一個錯誤說:

"coumn 'biological.medication_dose' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.".

所以我儘量將medication_dose到GROUP BY子句中,但隨後它給了我,我不額外行不想要。 我想在我的表格中獲得每種藥物的最新行。 (最新一行由最大功能決定,獲取最新日期)。

我該如何解決這個問題?

+0

它看起來像OP是使用SQL Server。 – 2010-02-28 00:19:46

+0

在c#中使用visual studio 2008編碼的那個。我認爲這是SQL Server的權利? – jello 2010-02-28 00:21:19

+0

另請參閱:http://stackoverflow.com/questions/121387/sql-fetch-the-row-which-has-the-max-value-for-a-column,http://stackoverflow.com/questions/ 95866/select-max-in-group,http://stackoverflow.com/questions/612231/sql-select-rows-with-maxcolumn-value-distinct-by-another-column,和其他許多人。 – outis 2010-02-28 04:44:47

回答

5

用途:

SELECT b.medication_name, 
     b.patient_history_date_bio AS med_date, 
     b.medication_dose 
    FROM BIOLOGICAL b 
    JOIN (SELECT y.medication_name, 
       MAX(y.patient_history_date_bio) AS max_date 
      FROM BIOLOGICAL y 
     GROUP BY y.medication_name) x ON x.medication_name = b.medication_name 
            AND x.max_date = b.patient_history_date_bio 
WHERE b.patient_id = ? 
+0

+1 - 只是給我貼了帖子。這是正確的(也是醫學上安全的!)的答案,因爲它會給出最新的劑量,而不是MAX()給出的最高劑量(不一定是最新的劑量)。我唯一的補充是,如果有多個記錄具有相同的日期 - 如果是這種情況,則需要另外使用另外的字段來確定最新的(例如,IDENTITY字段)。 – AdaTheDev 2010-02-28 00:35:09

+0

thx很多人(即使我有一點麻煩理解你的陳述...不用擔心,我會弄清楚)。對於最近的回覆感到抱歉 – jello 2010-03-01 23:46:19

+0

嗯毫不奇怪,這似乎並沒有工作....它只給了我2行,而它應該給3 ... – jello 2010-03-03 04:18:13

0

您需要在您的選擇中加入max(medication_dose)Group by返回一個結果集,其中包含您的group by子句中的字段的不同值,因此顯然您有多個記錄具有相同的medication_name,但劑量不同,因此您得到兩個結果。

通過放入max(medication_dose)它將返回每個medication_name的最大劑量值。您可以使用任何劑量的聚合函數(最大值,最小值,平均值,總和等)

1

如果你真的有,作爲一個快速的解決方法,你可以申請一個聚合函數您medication_doseMAX(medication_dose)

但是請注意,這通常表示您要麼不正確地構建查詢,要麼需要重構/規範化數據庫架構。在你的情況下,它看起來像你正在處理查詢不正確。正確的方法應該是OMG Poinies in another answer所建議的方法。

你可能有興趣在檢查出描述該錯誤背後的原因如下有趣的文章: