2010-02-28 137 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所建议的方法。

你可能有兴趣在检查出描述该错误背后的原因如下有趣的文章: