按 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 语句分组的主要内容,如果未能解决你的问题,请参考以下文章

按语句分组 SQL

按 SQL 语句分组

sql多条件分组查询,求sql语句。

sql数据库怎么实现分组并取每组的前1条语句,按日期排序?

SQL: 一般情况按年分组,特殊年份按指定日期分组,SELECT语句怎么写?

sql语句 按一列分组 然后再按别一列组内排序?