按 SQL 语句分组
Posted
技术标签:
【中文标题】按 SQL 语句分组【英文标题】:Group by SQL statement 【发布时间】:2010-02-28 00:16:46 【问题描述】:所以我得到了这个声明,它工作正常:
SELECT MAX(patient_history_date_bio) AS med_date, medication_name
FROM biological
WHERE patient_id = 12)
GROUP BY medication_name
但是,我也想要相应的药物剂量。所以我输入了这个
SELECT MAX(patient_history_date_bio) AS med_date, medication_name, medication_dose
FROM biological
WHERE (patient_id = 12)
GROUP BY medication_name
但是,它给了我一个错误提示:
“comn 'biological.medication_dose' 在选择列表中无效,因为它既不包含在聚合函数或 GROUP BY 子句中。”。
所以我尝试将 drug_dose 添加到 GROUP BY 子句中,但随后它给了我不想要的额外行。 我想获得表中每种药物的最新行。 (最新行由max函数确定,获取最新日期)。
我该如何解决这个问题?
【问题讨论】:
看起来 OP 正在使用 SQL Server。 Visual Studio 2008 用 c# 编码使用的一种。我觉得是sql server吧? 另请参阅:***.com/questions/121387/…、***.com/questions/95866/select-max-in-group、***.com/questions/612231/… 等。 【参考方案1】:用途:
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 = ?
【讨论】:
+1 - 刚刚让我发帖。这是正确的(并且在医学上是安全的!)答案,因为它将给出最新剂量,而不是 MAX() 给出的最高剂量(不一定是最新剂量)。我唯一的补充是,如果有多个记录具有相同的日期 - 如果是这种情况,您需要使用另一个字段来确定最新的(例如 IDENTITY 字段)。 谢谢很多人(即使我在理解您的陈述时遇到了一点麻烦……不用担心,我会弄清楚的)。抱歉回复晚了 hmmmm 很奇怪,这似乎不起作用....它只给了我 2 行,而它应该给 3... @jello:数据是什么样的? @OMG Ponies:你到底是什么意思?【参考方案2】:如果您确实需要,作为一种快速解决方法,您可以将聚合函数应用于您的 medication_dose
,例如 MAX(medication_dose)
。
但是请注意,这通常表明您正在错误地构建查询,或者您需要重构/规范化您的数据库架构。在您的情况下,您似乎错误地处理了查询。正确的方法应该是OMG Poinies in another answer建议的方法。
您可能有兴趣查看以下描述此错误背后原因的有趣文章:
But WHY Must That Column Be Contained in an Aggregate Function or the GROUP BY clause?【讨论】:
【参考方案3】:您需要将max(medication_dose)
放入您的选择中。 Group by
返回一个结果集,其中包含 group by 子句中字段的不同值,因此显然您有多个记录具有相同的 medication_name
,但剂量不同,因此您得到两个结果。
通过输入max(medication_dose)
,它将返回每个medication_name
的最大剂量值。您可以对剂量使用任何聚合函数(最大值、最小值、平均值、总和等)
【讨论】:
以上是关于按 SQL 语句分组的主要内容,如果未能解决你的问题,请参考以下文章