Oracle SQL - 使用SUM和MAX获取id

时间:2014-05-19 08:01:56

标签: sql oracle

在oracle中使用SUM和MAX时遇到了一些困难。

我要做的是找到分数最高的患者。

我想选择总分和患者ID。

如果我运行此查询,我得到的分数最高,但没有达到预期的任何患者详细信息。

        SELECT MAX(SUM(PM.score)) AS Total
        FROM Patient P, PatientMetabolic PM
        WHERE P.patientID = PM.patientID
        GROUP BY P.patientID

如果我像这样添加患者ID

        SELECT MAX(SUM(PM.score)) AS Total, P.patientId
        FROM Patient P, PatientMetabolic PM
        WHERE P.patientID = PM.patientID
        GROUP BY P.patientID

我得到而不是单组群组功能错误。

感谢你的时间,非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

这样做:

WITH sums AS    
(
    SELECT P.patientID, SUM(PM.score) AS Total
    FROM Patient P, PatientMetabolic PM
    WHERE P.patientID = PM.patientID
    GROUP BY P.patientID
)
SELECT * FROM sums WHERE total=(SELECT MAX(total) FROM sums);

这为您提供了MAX分数总和的所有患者ID。

答案 1 :(得分:0)

您可以使用RANK() OVER()按分数对患者进行排名,并选择排名最高的患者;

WITH cte AS (
  SELECT p.patientid, p.name, SUM(pm.score) AS Total,
         RANK() OVER (ORDER BY SUM(pm.score) DESC) rank
  FROM patient p
  JOIN patientmetabolic pm
    ON p.patientid = pm.patientid
  GROUP BY p.patientid, p.name
) 
SELECT patientid, name FROM cte WHERE rank=1;

An SQLfiddle to test with

如果您不想要关联以返回多个结果,则可以使用ROW_NUMBER() OVER()来破坏关系。

如果您想要整个排名列表,只需删除外部查询的排名条件(在这种情况下,您可能希望按排名顺序)