SQL语句中的Group by是什么意思?

4

我拿到了这个语句,它可以正常工作:

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

但是,它给了我一个错误提示:
“在选择列表中,'biological.medication_dose'列无效,因为它既不包含聚合函数也不包含GROUP BY子句。”
所以我尝试将medication_dose添加到GROUP BY子句中,但这会给我带来额外的行,而我并不想要这些行。我想在我的表中为每种药物获取最新的行。(最新的行由max函数确定,获取最新的日期)。
怎么解决这个问题?

看起来OP正在使用SQL Server。 - Daniel Vassallo
使用Visual Studio 2008编写C#代码时,所使用的是SQL Server吧? - jello
另请参阅:https://dev59.com/VHVD5IYBdhLWcg3wAWkO,https://dev59.com/NnVD5IYBdhLWcg3wE3bz,https://dev59.com/h3RB5IYBdhLWcg3weHLx等等。 - outis
3个回答

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 = ?

+1 - 刚好比我抢先了。这是正确的(也是医学上安全的!)答案,因为它会给出最新的剂量,而不是MAX()会给出的最高剂量(这未必是最新的剂量)。我的唯一补充是,如果有多个记录具有相同的日期 - 如果是这种情况,您需要使用另一个字段来确定最新的记录(例如,一个IDENTITY字段)。 - AdaTheDev
非常感谢你,虽然我有一点难以理解你的陈述...不用担心,我会弄清楚的。很抱歉回复晚了。 - jello
这很奇怪,似乎不起作用...它只给了我2行,而应该是3行... - jello
@jello:数据长什么样? - OMG Ponies
@OMG Ponies:你确切指的是什么? - jello
@jello:请发布一些示例数据,这样我就可以尝试重现这个问题。 - OMG Ponies

1

如果你真的必须这样做,作为一种快速的解决方法,可以对你的medication_dose应用聚合函数,例如MAX(medication_dose)

然而,请注意,这通常表明您正在构建查询时存在问题,或者需要重构/规范化数据库模式。在您的情况下,看起来您正在错误地处理查询。正确的方法应该是OMG Poinies在另一个答案中提出的

您可能会对以下有趣的文章感兴趣,其中描述了此错误背后的原因:


0

你需要在你的选择语句中加入 max(medication_dose)Group by 返回一个结果集,其中包含你的 group by 子句中字段的不同值,因此显然你有多个记录具有相同的 medication_name,但剂量不同,所以你得到了两个结果。

通过加入 max(medication_dose),它将返回每个 medication_name 的最大剂量值。你可以对剂量使用任何聚合函数(max、min、avg、sum 等)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接